[英]Object.create works new() doesn't
有这个:
sillyObject = {
init: function init(sillySettings) {
name = sillySettings.name
}
};
sillyObject.showAlert = function(x) {
return alert(x);
};
当我运行此代码时:
var sillyvar = new sillyObject()
sillyvar.init(mySettings);
silly.showAlert("silly!");
我收到一个错误,但是如果我使用Object.create运行相同的东西,它将运行。
var sillyvar = Object.create(sillyObject);
sillyvar.init(mySettings);
silly.showAlert("silly!");
任何(愚蠢的)帮助将不胜感激。
如果尝试执行new sillyObject()
,则您得到的错误是Uncaught TypeError: object is not a function
因为sillyObject
是对象而不是函数。
该答案很好地概述了new
关键字。
Object.create
与new
没有做相同的事情。 它将使用sillyObject
作为原型创建一个新对象。
new和Object.create是两个根本不同的东西。
new
预期会跟随一个函数,如果没有,则(如您所见)它将给您一个错误。 这是因为new希望调用构造函数,然后将其用作新执行上下文的基础。 在那个上下文中,函数this
绑定到执行上下文的范围。 函数执行完成后,将返回this
值, this
值通常已附加一些数据。 在您的示例中,它看起来像这样:
function sillyObject() {}
sillyObject.prototype.init = function(sillySettings) {
//perhaps you wanted to attach this name to the sillyObject?
name = sillySettings.name;
//which would look like this
this.name = sillySettings.name;
//because `this` here refers to the object context (remember?)
};
sillyObject.prototype.showAlert = function(x){
return alert(x);//returning alert simply returns undefined (not sure why this is used here)
};
然后可以使用new,它将使用构造函数创建执行上下文,然后附加原型,最终得到一个新的sillyObject实例(所有实例都不同)。
var sO = new sillyObject();
sO.init(mySettings);
sO.showAlert("silly!");
另一方面, Object.create()
期望将对象作为参数(这就是您的版本在这里工作的原因)。 它将使用该对象参数作为模板来创建一个新对象。 或如MDN所解释的那样 “ Object.create()方法使用指定的原型对象和属性创建一个新对象”。 如果没有对对象执行任何其他操作,这基本上会创建一个副本,这就是警报在这里起作用但在new
版本中不起作用的原因。
sillyObject
是一个Object而不是一个函数。 new
将创建一个函数的新实例。 您可能要使用this
或仅使用.prototype
var sillyObject = function () {
this.sillySettings = {};
}
sillyObject.prototype = {
init : function (name) {
this.sillySettings.name = name;
},
showAlert: function (x) {
return alert(x);
}
};
var silly = new sillyObject();
silly.init('foo');
silly.showAlert('bar');
this.sillySettings
不是函数,因此我们不保留在原型中。 我们可以将init
和showAlert
在原型中。 我们之所以使用原型,是因为当使用new
我们使用了sillyObject()
因此可以想象变量silly被这个sillyObject()
所替代, sillyObject()
说明了为什么我们使用原型是因为silly
是作为函数实例化的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.