我现在正在写一些JS,但我不知道如何在JS中创建一个对象......在很多网站上我找到了很多答案,但应该使用哪一个?首先,我认为没有什么不同。但我希望你们中的一些人可以告诉我更多。
这里有三种方式:
// Way 1
var SomeObject = {
foo: "bar",
bar: "foo",
someMethod: function() {
//code
}
};
// Way 2
var SomeObject = function() {
var self = this;
this.foo = "bar";
this.bar = "foo";
this.someMethod = function() {
//code
}
}
// Way 3
var SomeObject = function() {
var self = this;
this.foo = "bar";
this.bar = "foo";
}
SomeObject.prototype.someMethod = function() {
//Code
}
答案 0 :(得分:2)
三者不同:
第一个对象具有属性foo
,而第二个和第三个对象没有。后者是构造函数,可以创建具有foo
属性的对象。
方法2和方法3也有所不同:方式2是使用someMethod
方法传递对象的构造函数,而方式3则不是。{方式3将该方法定义为一级 - 在原型上。
Way | constructor | instance has
| | own someMethod
----+-------------+---------------
1 | no | yes
2 | yes | yes
3 | yes | no
当你只需要一个对象实例,一个单例,然后你可能会做的方式1。一旦你需要不止一个,方法1是不可取的。
如果你的方法有很多代码,那么方法3几乎肯定是你想要的:你想避免为每个对象实例重新创建该函数。另一方面,如果没有在对象本身上定义方法,而是在原型上定义方法,则会有轻微的开销。话虽如此,JavaScript优化了代码并可能在这样做时消除这两个问题。但是方式3是最常用的OOP方式。
方式3的缺点是您无法访问私人成员,例如self
。如果它的代码依赖于this
,那么必须注意在原型的实例上调用这些方法(或者明确地绑定到这样的方法),否则结果可能是意外的。
答案 1 :(得分:2)
第一种方式称为对象文字。第二种和第三种方式相同,称为函数对象。在JavaScript函数中是对象,上面的方法2,3只是在someMethod()方法的实现上有所不同,而不是在对象定义/实现中。您还可以使用var newObj = Object.create(Object.prototype),其中newObj将继承Object.prototype。哪个最好 。 。 。 Douglas Crockford说,Object文字声明是最好的,因为它更具可读性和紧凑性。
此外,也许您已经知道这一点,但如果您正在嵌套函数,则只需要创建var self = this。