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

JavaScript: Which way to create a new object type

本文关键字:类型 方法 对象 创建 新对象 JavaScript      更新时间:2023-09-26

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

第一种方法称为对象文字。第二和第三种方式是相同的,称为函数对象。在 JavaScript 中,函数是对象,上面的方式 2,3 仅在它们对 someMethod() 方法的实现上有所不同,而不是在对象定义/实现中。你也可以使用 var newObj = Object.create(Object.prototype),其中 newObj 将继承 Object.prototype。什么是最好的 . . .道格拉斯·克罗克福德(Douglas Crockford)说,对象文字声明是最好的,因为它更具可读性和紧凑性。

另外,也许你已经知道这一点,但是如果你是嵌套函数,你只需要创建var self = this。

三者不同:

第一个对象有属性foo,而方式2和3没有。后者是可以创建具有 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,则必须注意在该原型的实例上调用这些方法(或显式绑定到该实例),否则结果可能是意外的。