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

JavaScript:创建新对象类型的方法是什么,javascript,object,Javascript,Object,我现在正在写一些JS,但我不知道舒尔如何在JS中创建对象。。。在许多网站上,我找到了很多答案,但应该使用哪一个呢?首先,我认为没有什么不同。但我希望你们中的一些人能告诉我更多 以下是三种方法: // Way 1 var SomeObject = { foo: "bar", bar: "foo", someMethod: function() { //code } }; // Way 2 var SomeObject = function() {

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

三者不同:

第一个对象具有属性
foo
,而方式2和3没有。后者是可以生成具有
foo
属性的对象的构造函数

方法2和方法3也不同:方法2是一个构造函数,它使用
someMethod
方法交付对象,而方法3则不是。方法3将在原型上定义该方法

Way | constructor |实例
||拥有某种方法
----+-------------+---------------
1 |否|是
2 |是|是
3 |是|否
选择什么? 当您只需要一个对象实例,即一个单例时,您可能会使用方式1。一旦你需要不止一个,方法1是不可取的

如果您的方法有很多代码,那么几乎可以肯定的是,方法3就是您想要的:您希望避免为每个对象实例重新创建该函数。另一方面,如果方法不是在对象本身上定义的,而是在原型上定义的,则会有轻微的开销。话虽如此,JavaScript优化了代码,这样做可能会消除这两个问题。但是方法3是最面向对象的方法


方法3的缺点是您无法访问私有成员,例如
self
。如果其代码依赖于此,则必须注意在该原型的实例上调用这些方法(或显式绑定到该原型),否则结果可能是意外的。

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


另外,可能您已经知道了这一点,但是如果您正在嵌套函数,您只需要创建var self=this。

var obj={}
var obj=new Object()
为您提供了更多的可能性。因此,如果我使用第三种方法,并且我有两个来自键入SomeObject的对象和方法someMethod的对象,那么someMethod可以访问
self.foo
。如果我调用
objOne.someMethod()
,它只会影响第一个对象?如果是,我将使用第三种方法。如果创建
this.me=this
而不是
var me=this
更好?我读到,这是创建自我参考并在我的方法中使用它们的一个好方法,因为我不能成为舒尔的
。就像我写的那样,在方法3中,您无法访问
自我
,因为它是私人会员。所以这是不可能的。
someMethod
将作用于的对象(
this
)由调用的上下文决定。定义
this.me=this
无助于避免
this
特性,因为您需要
this
才能访问
me
。如果您在正确使用
时遇到问题,那么方法3会让您头疼。但是如果你对
这个
的工作原理有很好的理解,你可以用方法3做任何事情。或者只使用工厂?这样你就可以避免以后的问题了?嗯,该死,所以也许第三种方式不是最好的。例如,我有一个移动方法,通过更改
x
y
来移动对象,这两个方法都是私有的。实际上,如果
x
y
是私有的,那么您需要在对象(而不是原型)上定义方法来公开它们,否则您无法通过方式3访问它们。方法2可能最适合你。