有这个:
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!");
任何(愚蠢的)帮助将不胜感激。
答案 0 :(得分:2)
如果你尝试new sillyObject()
,那么你得到的错误是Uncaught TypeError: object is not a function
,因为sillyObject
是一个对象,而不是一个函数。
This answer概述了new
关键字。
Object.create
与new
的功能不同。它将创建一个以sillyObject
为原型的新对象。
答案 1 :(得分:2)
new和Object.create是两个根本不同的东西。
new
将会出现一个函数,如果没有(如你所见)它会给你一个错误。这是因为new期望调用构造函数,然后将其用作新执行上下文的基础。在该上下文期间,函数具有绑定到执行上下文范围的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 explains it" Object.create()方法使用指定的原型对象和属性"创建一个新对象。如果对象没有其他任何操作,这基本上会创建一个副本,这就是警报在这里工作但不在new
版本中的原因。
答案 2 :(得分:0)
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()
,所以想象变量傻被替换为sillyObject()
,显示我们使用原型的原因,因为silly
被实例化为函数。