1

私が書くと動作しますhttp://jsfiddle.net/XJwvP/):

var Person = function(name) { this.name = name; }
Person.prototype = function () {
   var sayHello = function (name) {
         alert("Hello, " + name);
   };

   return {
      sayHello: sayHello
   };
}();

var person = new Person("Max");
person.sayHello("James");

私が書いてもうまくいきませんhttp://jsfiddle.net/ZKd4R/):

Array.prototype = function () {
   var sayHello = function (name) {
         alert("Hello, " + name);
   };

   return {
      sayHello: sayHello
   };
}();

var array = new Array();
array.sayHello("James");

エラー:

Uncaught TypeError: Object [object Array] has no method 'sayHello' 

配列オブジェクトに同じアプローチを使用できないのはなぜですか?

4

2 に答える 2

3

コンストラクターは言語で特別なので (組み込みのコンストラクターです)、新しいインスタンスにArray.prototypeは影響しません。仕様は15.4.2.1で述べています:ArrayArray

新しく構築されたオブジェクトの [[Prototype]] 内部プロパティは、 Array.prototype ( 15.4.3.1 )の初期値である元の Array プロトタイプ オブジェクトに設定されます。

15.4.3.1をチェックすると、それArray.prototypeも [[Writable]]ではないことに気付くでしょう。Chromeコンソールでそれをテストしました:

var ap = Array.prototype;
Array.prototype = {};
ap == Array.prototype; // true
于 2013-09-19T21:59:49.143 に答える
1

@bfavaretto は、それが機能しない理由をすでに説明しています。このような問題を回避するために使用する必要があるパターンは次のとおりです。

function Person(name) { this.name = name; }
(function(proto) {
   function sayHello(name) {
         alert("Hello, " + name);
   }

   proto.sayHello = sayHello;
}(Person.prototype));

var person = new Person("Max");
person.sayHello("James");

(function(proto) {
    function sayHello(name) {
        alert("Hello, " + name);
    }

    proto.sayHello = sayHello;
}(Array.prototype));

var array = []; // or `new Array();`
array.sayHello("James");

これを mixin プロトタイプ パターンと呼びましょう :-)

于 2013-09-19T22:13:14.783 に答える