1

次のテストを作成しましたが、なぜ機能しないのかわかりません:http: //jsfiddle.net/SKphY/。「こんにちは」と「さようなら」と「さようなら」の3つのアラートダイアログが表示されるはずです。代わりに、最初の2つだけを取得しています。

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
});

重要なのは、オブジェクトの継承、この場合はオブジェクトリテラルの操作方法を学んでいることです。また、Object.createではなくjQuery.extendを使用すると、なぜそれが機能するのか興味があります。私の知る限り、https: //developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/createで概説されているアプローチに従っているようです。私は何が間違っているのですか?

お時間をいただきありがとうございます、ktm。

4

2 に答える 2

3

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

@headacheCoderが指摘しているように、の2番目の引数Object.createはプロパティオブジェクト用です(これは、リンクしたMDNドキュメントでも説明されています)。

実行可能な解決策については、上記のリンクを確認してください。

var obj1 = Object.create(p, {
    goodbye : {value : function() {
        alert('goodbye');
    }}
}); 
于 2013-02-09T03:03:00.727 に答える
2

Object.createの2番目の引数は、マージ用ではなく、プロパティオブジェクト用です。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 に答える