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

时间:2017-09-13 06:39:08

标签: javascript

我正在学习JavaScript,我想出了这个想法

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

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

如果我创建一个对象并将其__proto__指向构造函数的原型。 是否与使用new创建对象的方法相同?

3 个答案:

答案 0 :(得分:0)

在您的方案中,它们是等效的(尽管__proto__历来不鼓励,因为它没有正确标准化),但仅仅因为a的定义是空的。

如果a执行某些初始化,则不会对c执行此操作。

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

答案 1 :(得分:0)

原则上,你不需要任何东西。 Javascript只是略微不同的创建对象的方式(当然)工作略有不同。在您的示例中:

not integers

作为一个基本的经验法则,如果您只是想创建一个对象,请使用对象的文字方式。如果你想使用构造函数模式,你想使用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__

最新的ES语法引入了Object.create({})关键字来抽象出构造函数模式。这是该语言的偏振特征。阅读更多here

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

答案 2 :(得分: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
}