1

我创建了以下测试,但不确定为什么它不起作用: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。

4

2 回答 2

3

http://jsfiddle.net/SKphy/1/

正如@headacheCoder 指出的那样,第二个参数Object.create用于属性对象(这也在您链接的MDN 文档中进行了描述)。

检查上面的链接以获得可行的解决方案:

var obj1 = Object.create(p, {
    goodbye : {value : function() {
        alert('goodbye');
    }}
}); 
于 2013-02-09T03:03:00.727 回答
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) }
}})
于 2013-02-09T02:59:43.970 回答