我正在学习JavaScript,我只是想出了这个想法为什么我需要'新'来创建一个对象?
为什么我需要'新'来创建一个对象?
function a(){};
var b = new a();
var c = {};
c.__proto__ = a.prototype;
如果我创建一个对象,并指出这是__proto__
到构造函数的原型。 与使用new
创建对象的方法相同吗?
我正在学习JavaScript,我只是想出了这个想法为什么我需要'新'来创建一个对象?
为什么我需要'新'来创建一个对象?
function a(){};
var b = new a();
var c = {};
c.__proto__ = a.prototype;
如果我创建一个对象,并指出这是__proto__
到构造函数的原型。 与使用new
创建对象的方法相同吗?
在你的场景中,它们将是等效的(尽管__proto__
由于未被正确标准化而历来不受欢迎),但仅仅是因为a
的定义为空。
如果a
会执行一些初始化,则不会为c
完成。
至于为什么new
是必要的,叫a()
和new a()
之间的区别是上下文对象(this
将是全局对象或新创建的对象)。
原则上,你不需要需要什么。 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。
希望它有帮助,快乐的学习!
对不起,语法error.Thanks你的答案,它有很大的帮助! – franose
首先,__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
}
您的代码是无效的。 –
第一行应该是** function a(){}; ** –
对不起,我刚编辑它。 – franose