JavaScript:创建新对象类型的方法

时间:2016-04-23 19:31:33

标签: javascript object

我现在正在写一些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
}

2 个答案:

答案 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。