2017-09-13 87 views
-2

我正在学习JavaScript,我只是想出了这个想法为什么我需要'新'来创建一个对象?

为什么我需要'新'来创建一个对象?

function a(){}; 
var b = new a(); 
var c = {}; 
c.__proto__ = a.prototype; 

如果我创建一个对象,并指出这是__proto__到构造函数的原型。 与使用new创建对象的方法相同吗?

+1

您的代码是无效的。 –

+0

第一行应该是** function a(){}; ** –

+0

对不起,我刚编辑它。 – franose

回答

0

在你的场景中,它们将是等效的(尽管__proto__由于未被正确标准化而历来不受欢迎),但仅仅是因为a的定义为空。

如果a会执行一些初始化,则不会为c完成。

至于为什么new是必要的,叫a()new a()之间的区别是上下文对象(this将是全局对象或新创建的对象)。

0

原则上,你不需要需要什么。 Javascript的创建对象略有不同,当然这些对象的工作方式稍有不同。在你的例子:

function a() = {}; // syntax error, correct syntax is function a() {} 
var b = new a(); // creates a new instance of a - assuming a is a constructor function 
var c = {}; // creates a new object literal 
c.__proto__ = a.prototype // assings the prototype of function a to __proto__ of c 

根据经验的基本规则,如果你只是想创建一个对象使用对象字面方式。如果你想使用构造函数模式,你想使用new关键字来使用构造函数创建实例 - 你也可以手动创建实例,但new是语法糖。我会尽量避免直接将对象分配给__proto__,因为这通常是在内部完成的。另一种基于其他对象创建对象的方法是使用Object.create({})

最新的ES语法引入了class关键字来抽象出构造函数模式。这是该语言的一个极端特征。阅读更多here

希望它有帮助,快乐的学习!

+0

对不起,语法error.Thanks你的答案,它有很大的帮助! – franose

0

首先,__proto__仅支持safari,chrome,firefox,IE不支持,并且尚未成为标准。

function Animal(name) { 
    this.name = name; 
} 

Animal.prototype.run = function() { 
    console.log(this.name + 'can run...'); 
} 

var cat = new Animal('cat'); 

到模拟new过程如下:

//Simulation process 
new Animal('cat')=function(){ 
    let obj={}; //create an empty object 
    obj.__proto__=Animal.prototype; 
    //obj->Animal.prototype->Object.prototype->null 
    return Animal.call(obj,'cat');// bind this to the instantiated object 
} 
+0

谢谢!所以真正的'new'模拟更加复杂,因为真正的构造函数不是空的。关键字'new'有助于简化流程? – franose

+0

是的,快点吧 – Alvin

相关问题