我发现在JavaScript中很难理解OOP。JavaScript OOP类和声明
通常我会希望创建一个类,然后从该类创建对象。
但是,根据一个教程,以下内容会产生一个对象。
var egg = {}
难道我没有做过一个名为egg的对象,但实际上没有上课。
如果那是我会怎么做,从一个对象的多个对象的情况:S
而且根据不同的教程的对象是由像下面,这是完全的区别是什么,我上面说:S
var Block = function(){
}
谁能帮我解开我的困惑:(
我发现在JavaScript中很难理解OOP。JavaScript OOP类和声明
通常我会希望创建一个类,然后从该类创建对象。
但是,根据一个教程,以下内容会产生一个对象。
var egg = {}
难道我没有做过一个名为egg的对象,但实际上没有上课。
如果那是我会怎么做,从一个对象的多个对象的情况:S
而且根据不同的教程的对象是由像下面,这是完全的区别是什么,我上面说:S
var Block = function(){
}
谁能帮我解开我的困惑:(
JavaScript是与迄今为止学到的不同的语言。你不能指望事情和你改变语言时一样。
快速偷看:在JavaScript中,您可以将一个函数分配给一个变量。我敢打赌,你已经使用其它语言,这是不可能的:
var myCounter = 1;
var myFunction = function(x){ return x + 1; };
再回到你的问题:在javascript中有没有“真正的类”。只有对象。我知道这听起来可能听起来很混乱。
Javascript的对象模型被称为“原型继承”。它不同于“经典”(双关意图)的继承。而且它也是not very cleanly implemented。基本上,你从一个缩小的对象集合(数组,对象,而不是类)开始,然后使用这些对象来构建其他对象。他们之间的关系可以是“类和实例”,但他们不必这样做。他们也可以是其他种类的关系。
由于没有类,所以不能创建它们。但是你可以创建一个常规的对象,将它分配给变量Car,并且只是想“我要用这个对象来创建很多其他对象,而其他对象默认会有一些属性,比如方法和东西,让他们表现得像汽车一样“。语言允许你这样做。汽车将像其他语言中的类一样行事,它产生的对象将“像汽车的实例”一样。
但是,对于javascript来说,它们看起来像是一些对象,它们之间有一些关系。
从某种意义上说,原型继承是经典继承的“超集”。你可以做经典的继承,但也可以做其他事情。
有我不只是做一个指定的对象不蛋居然作出 类。
没错。所有你在做的是实例化基地Object
对象 - 你还没有做任何事情,你可以使的的实例。
在JavaScript中,没有形式化的类概念 - 仅仅通过实例化而不是调用函数来实现它们的模拟。
function Animal() { this.animal = true; }
Animal.prototype.sayHi = function() { alert(this.name+' says hi!'); }
function Dog(name) { this.name = name; }
Dog.prototype = new Animal();
...
var fido = new Dog('Fido');
fido.sayHi(); //"Fido says hi!";
注意第4行只是模拟继承的几种方法之一。
所以在JavaScript中,类和函数都只是函数。没有任何固有的东西可以防止用于实例化的函数在没有new
运算符的情况下被调用,反之亦然。
在前一种情况下,常见的解决方法是检查构造是“类”(如果调用并没有实例化,构造函数会Object
)和重新路由的必要:
function Dog(name) {
//if we weren't instantiated, the constructor will be Object, not Dog
if(this.constructor != Dog) return new Dog(name);
this.name = name;
}
var fido = Dog(); //bad - invocation should be instantiation
这是最简单的,尽管是一种天真的方式,它需要实例化基础对象才能设置原型链。足以回答这个问题。我写了一篇关于在JS中构成正确继承的文章。 http://js-bits.blogspot.com/2010/08/javascript-inheritance-done-right.html – 2012-07-13 22:31:17
你说得很对,胡安 - 这绝对是实现继承的几种方法中最简单的方法(它们都不是完美,都有特色)。我将它包含在这里,以免混淆答案的主要观点。我会检查你的帖子。 – Utkanos 2012-07-13 22:38:42
我其实也写了关于缓解调用构造函数时没有新运算符的问题:) http://js-bits.blogspot.com/2010/08/constructors-without-using-new.html似乎是什么你在做这个测试。构造函数' – 2012-07-13 23:19:54
是var egg = {}
是一个对象,但它不是一个对象的实例。
在JavaScript中,简单地说这种方式基本上是js的单例的概念,意味着它正是它的意思。
//this is a js singleton, and all properties of this object are public.
var egg = {
name: 'humpty',
smush: function() { console.log('splat!'); },
weight: '4oz'
};
console.log(egg.weight); //4oz
而,较传统型对象将被使得它的功能,然后可以实例化:
var Egg = function(name, weight) {
var name = name;
this.smush = function() { console.log('splat!'); }
this.weight = weight;
};
var e2 = new Egg('dumpty','6oz');
console.log(e2.name); //will not return name. (since i wrote var name and not this.name, its "private" and thus cannot be accessed.)
console.log(e2.weight); //4oz
“未定义,因为我们有范围”是什么意思?你从未分配过'this.name = name'。另外,为什么当已经有一个(参数)时创建一个局部变量名称。回答这个问题,但它不是很清楚 – 2012-07-13 23:17:43
哦,我只是做了一个说明,在我们的Egg()对象中,你可以通过区分var x和this.x来阻止仅仅是公开的事情......我将重写它更清楚 – Kristian 2012-07-14 00:21:37
的上述两个实例都是正确的。把它简单地放在JavaScript中是一个对象。类不存在,但有很多方法可以模仿它们。我最喜欢的方法如下:现在
var myClass = function() { <----------------------------- class declaration
var prop1,
prop2, <------------------------------------ private properties
prop3;
var addMe = function(arg1, arg2) { <------------ private method
var result = arg1 + arg2;
return result;
}
var obj = { <------------------------------------- constructor method
Prop1: prop1,
Prop2: value2, <----------------------------- public properties
Prop3: value3,
Method: function() { <------------------------ public method
obj.prop3 = obj.prop1 + obj.prop2;
return obj.prop3;
}
}
obj.Prop4 = addme(prop1, prop2); <-------------- public property set
with the private method
return obj;
}
var myClassObj = new myClass;
myClassObj是MyClass的一个对象有四个公共属性 PROP1,PROP2,Prop3,Prop4和一个叫方法
你想看看“原型的公共方法继承“的JavaScript。 http://www.crockford.com/javascript/inheritance.html
[构造函数和对象之间的差异]可能的重复(http://stackoverflow.com/questions/4559207/difference-between-a-constructor-and-an-object) – qwertymk 2012-07-13 22:16:49
但这样做不会毁掉整个点OOP? – 2012-07-13 22:17:33
btw。你在'var Block = ...'语句中缺少一个新的东西 – 2012-07-13 22:23:22