3

プロトタイプの参照プロパティをその子の間で共有するという問題にどのように対処しますか? この問題を解決するためのよく知られたパターン (コンストラクター内でプロパティを再定義する以外) はありますか? これはまったく問題ですか、それともプロトタイプの継承について私が見逃していることがありますか?

例:

var dog = 
{
    name: "no-name",
    paws: ["front-right", "front-left", "back-right", "back-left"]
};

var rex = Object.create(dog);
rex.name = "Rex";

var bingo = Object.create(dog);
bingo.name = "Bingo";
bingo.paws.pop(); //Bingo is just like a dog, but has lost a paw in a tragic accident

console.log(bingo.paws); //["front-right", "front-left", "back-right"]
console.log(rex.paws); //Rex lost a paw too! ["front-right", "front-left", "back-right"]


アップデート:

プロトタイプの継承について学習した後、このパラダイムでのプログラミングの「自然な」方法は、オブジェクトを拡張することであり、「クラス」として使用するという意味でコンストラクターにあまり依存しないように思えます。私がブログで見た例 (また、Douglas Crockford のものとも一致しているようですObject.create) は、多かれ少なかれ次のようなものでした。

var Dog = 
{
    name: "no-name",
    paws: ["front-right", "front-left", "back-right", "back-left"],
    bark: function() { alert("Bark!!"); }
};

//No constructor acting like a "class"
var BigDog = Object.create(Dog);
BigDog.bark = function() { alert("WOLF!!!"); };

var thor = Object.create(BigDog);
thor.name = "Thor";
thor.bark();

新しいインスタンスで新しい配列をコピーまたは作成する唯一の方法はコンストラクターですか? Object.createこれが「未完成」のパターンでしょうか。

答えてくれてありがとう!

4

3 に答える 3

3

ご存知のように、オブジェクトのプロトタイプは、そのオブジェクトを構成する基本プロパティを含むオブジェクトです。そのプロトタイプ オブジェクトは、すべてのオブジェクトと同様に、名前から値へのマッピングです。JavaScript の配列 (およびオブジェクト) は常に参照によって渡されるため、プロトタイプで Object.create が呼び出されると、配列の参照が新しいオブジェクトにコピーされるだけです。TheZ が彼のコメントで述べたように、次のようなことができます。

function Dog(){
    this.paws = ['front-right', 'front-left', 'back-right', 'back-left'];
}
Dog.prototype = {
    name: 'no-name',
    paws: null
};

これで、オブジェクトを作成できます。

var rex = new Dog();
rex.name = 'Rex';

var bingo = new Dog();
bingo.name = 'Bingo';
bingo.paws.pop();
于 2012-10-16T20:10:08.857 に答える
2

モジュールパターンを調べる必要があります

あなたの犬が分離できるように、慣れ親しんだクロージャーを作ります

var dog = function(){
 //private
 var name = "no-name";
 var paws = ["front-right", "front-left", "back-right", "back-left"];

 //public
 function getName(){
  return name;
 }

 function setName(newName){
  name = newName;
 }

 function getPaws(){
  return paws;
 }

 function pawPain(){
  paws.pop();
 }

 //expose
 return{
  pawPain: pawPain,
  getPaws: getPaws,
  getName: getName,
  setName: setName
 };
};

これを使って新しい犬を作ることができます

var rex = new dog();    
var bingo = new dog();
rex.pawPain();
console.log(bingo.getPaws());
于 2012-10-16T20:12:01.053 に答える
-1

http://jsfiddle.net/sVaSp/

ただコンストラクタが必要です。各バージョンは、オブジェクトの独自のコピーを保持します。

    function dog(name) {
        this.name = "no-name",
        this.paws = ["front-right", "front-left", "back-right", "back-left"]
    } 

    var rex = new dog();
    rex.name = "Rex";

    var bingo = new dog();
    bingo.name = "Bingo";
    bingo.paws.pop(); //Bingo is just like a dog, but has lost a paw in a tragic accident

    console.log(bingo.paws); //["front-right", "front-left", "back-right"]
    console.log(rex.paws); //Rex lost a paw too! ["front-right", "front-left", "back-right"]​
于 2012-10-16T20:11:05.833 に答える