2012-02-16 28 views
12

我回答一个问题关于闭包在这里所以用这个例子:从JS关闭创建对象:我应该使用“新”关键字?

function Constructor() { 
    var privateProperty = 'private'; 
    var privateMethod = function(){ 
     alert('called from public method'); 
    }; 
    return { 
     publicProperty: 'im public', 
     publicMethod: function(){ 
      alert('called from public method'); 
     }, 
     getter: privateMethod 
    } 
} 

var myObj = new Constructor(); 

//public 
var pubProp = myObj.publicProperty; 
myObj.publicMethod(); 
myObj.getter(); 

//private - will cause errors 
myObj.privateProperty 
myObj.privateMethod 

用户评论我的回答说:

此外,如果你的函数明确地返回一个对象,它是不是一个好实践与称呼它,因为这是一种误导 - 如果使用新的你所期望的结果是构造

的实例我通常使用新的创建对象。但为什么不是一个好的做法?它似乎是使用新的和不使用新的返回相同的东西。什么是从闭包创建对象的正确方法?

回答

11

不,这不是一回事。使用instanceof时请考虑:

function C1() { 
    return {}; 
} 

function C2() { 
} 

var c1 = new C1(); 
var c2 = new C2(); 
alert(c1 instanceof C1); // false; wha...? 
alert(c2 instanceof C2); // true, as you'd expect. 

Here's a demo.

所以取而代之,将其分配给this,可能与保障措施,以防止遗忘new S创建它们。

function Constructor() { 
    var privateProperty = 'private'; 
    var privateMethod = function() { 
     alert('Called from private method'); 
    }; 

    this.publicProperty = "I'm public!"; 
    this.publicMethod = function() { 
     alert('Called from public method'); 
    }; 
    this.getter = privateMethod; 
} 

更妙的是,使用原型时可能:

function Constructor() { 
    var privateProperty = 'private'; 
    var privateMethod = function() { 
     alert('Called from private method'); 
    }; 

    this.getter = privateMethod; 
} 

Constructor.prototype.publicProperty = "I'm public!"; 
Constructor.prototype.publicMethod = function() { 
    alert('Called from public method'); 
}; 
+0

像这样:http://jsfiddle.net/DZTC8/1/都返回相同的东西,有或没有'new' – Joseph 2012-02-16 02:47:25

+4

@Joseph:我的观点是它使'instanceof'变得奇怪。返回的对象*不是构造函数*的实例,而是用户期望的,而只是一个对象。 – Ryan 2012-02-16 02:48:58

+0

+1“怪异”。谢谢!现在我明白了。 – Joseph 2012-02-16 02:58:21

2

考虑4点,从这样的回答:What is the 'new' keyword in JavaScript?

“它返回新创建的对象,除非构造函数返回一个非 - 原始值,在这种情况下,将返回该非原始值。“

因此,当minitech的答案中的函数C1返回一个空对象时,变量c1将是返回的对象而不是'new'语句创建的对象。因此没有构造函数的实例。

如果我尝试从构造函数返回一个原始值,我的webstorm告诉我:“当用new调用时,这个值将会丢失,而对象将被返回。”

相关问题