我正在学习JavaScript,我想出了这个想法
为什么我需要'new'来创建一个对象?
function a(){};
var b = new a();
var c = {};
c.__proto__ = a.prototype;
如果我创建一个对象并将其__proto__
指向构造函数的原型。
是否与使用new
创建对象的方法相同?
答案 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
}