继承和对象文字

时间:2013-02-09 02:48:59

标签: javascript jquery

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

2 个答案:

答案 0 :(得分:3)

http://jsfiddle.net/SKphY/1/

正如@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) }
}})