我创建了以下测试,但我不确定它为什么不起作用:http://jsfiddle.net/SKphY/。我应该得到三个警告对话:“你好”,“再见”和“再见”。相反,我只是考虑前两个。
var p = {
hello : function() {
alert('hello');
}
};
var obj1 = Object.create(p, {
goodbye : function() {
alert('goodbye');
}
});
var obj2 = $.extend(p, {
goodbye : function() {
alert('goodbye');
}
});
$(function() {
// The third line (below) gives the parser error:
// 'Uncaught TypeError: Property 'goodbye' of object #<Object>
// is not a function'
obj1.hello();
obj2.goodbye(); // This executes fine
obj1.goodbye(); // This gives the parser error
});
重点是我正在学习如何使用对象继承,在这种情况下使用对象文字,我很好奇为什么当我使用jQuery.extend时它为我工作,而不是使用Object.create。据我所知,我似乎已经遵循了https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/create中概述的方法。我做错了什么?
谢谢你的时间, KTM。
答案 0 :(得分:3)
正如@headacheCoder指出的那样,Object.create
中的第二个参数是属性对象(这也在你链接的MDN文档中描述)。
检查上面的链接以获得可行的解决方案:
var obj1 = Object.create(p, {
goodbye : {value : function() {
alert('goodbye');
}}
});
答案 1 :(得分:2)
Object.create中的第二个参数用于属性对象,而不是用于合并。请改用var obj1 = Object.create(p);
,它将按预期工作。
如果指定且未定义,则具有可枚举自身属性的对象(即,在其自身上定义的那些属性,而不是沿其原型链的可枚举属性)指定要添加到新创建的对象的属性描述符,以及相应的属性名。
// Example where we create an object with a couple of sample properties.
// (Note that the second parameter maps keys to *property descriptors*.)
o = Object.create(Object.prototype, {
// foo is a regular "value property"
foo: { writable:true, configurable:true, value: "hello" },
// bar is a getter-and-setter (accessor) property
bar: {
configurable: false,
get: function() { return 10 },
set: function(value) { console.log("Setting `o.bar` to", value) }
}})