私は JavaScript を初めて使用します (今週から学習を開始しました)。CodeCademy コースを修了しました (実際には Objects 1 && 2 の部分だけで、残りは退屈でした)。コンストラクターでプロトタイプの継承を学んだと思っていましたが、Douglas Crockford: Advanced JavaScriptを見始めました。
ビデオの冒頭で、彼は 2 種類の継承について言及しています。だから私はChrome JavaScriptコンソールで遊んで始めて、両方の継承モデルを使って何かをしようとしました.
//create constructor
function MyParent(){
this.name = "joe";
this.sayHi = function(){
console.log(this.name);
}
}
//create child object and inherit from parent
var myChild1 = new MyParent();
myChild1.name
"joe"
myChild1.sayHi()
joe
//add method to MyParent, so it can be accessed from myChild1
MyParent.prototype.sayBye = function(){ console.log("bye");}
myChild1.sayBye()
bye
//create another constructor
function MyParent2(){
this.sayHi = function(){
console.log("hi");
}
}
//make it inherit from MyParent, overwriting sayHi if object is instance of MyParent2
MyParent2.prototype = new MyParent();
//overwrote sayHi
var myChild11 = new MyParent2();
myChild11.sayHi();
hi
//still same as MyParent as its not overwriten in MyParent2
myChild11.name
"joe"
Object.create を使用して同じことを試みたよりも:
//create an object
var myParent = {
name : "joe",
sayHi : function(){
console.log(this.name)
}
};
//it works
myParent.sayHi()
joe
//create child object
var myChild = Object.create(myParent);
myChild.sayHi()
joe
//add bye method to myChild
myChild.sayBye = function(){ console.log("bye"); }
myChild.sayBye();
bye
//add bye method to myParent - does not overwrite child's bye
myParent.sayBye = function(){ console.log("bye2"); }
//however adding sayBye2 to parent, becomes available on already created child
myParent.sayBye2 = function(){ console.log("bye2"); }
myChild.sayBye2();
bye2
//but its the parent property
myChild.hasOwnProperty("sayBye2")
false
//could make million objects inherit from each other vertically or horizontally
var myChild2 = Object.create(myChild);
myChild2.name
"joe"
これまでのところ、第一印象だけで、私は両方のモデルが好きですが、後者の方が少し好きかもしれません. より表現力と力強さを増しているようです。
このトピックについていくつかの検索を行いましたvs.
が、各アプローチの長所と短所を説明する良い記事を見つけることができませんでした (後者以外は新しいブラウザーでのみサポートされていますが、簡単な回避策があります)。私が見つけた残りの投稿は、tl: dr; だけでした。そしてやや退屈。
だから私の質問は、どのタイプの継承を使用する必要があるかです。どちらかに関連する特典はありますか? いずれかの主な短所はありますか?両方をミックスできますか?(例: object を引数として に渡すことができることは知っていますnew Constructor()
))
ありがとう
編集: ブラウザーがサポートしていない場合に Object.create() の代替を作成するトリックを見て、ハックがいかに簡単であるかに気付きました。基本的に、空のコンストラクターを作成し、親オブジェクトをプロトタイプとして割り当て、構築されたコンストラクターを新しいオブジェクトとして返します。なんて巧妙なハックでしょう!
if(typeof Object.create !== "function") { Object.create = function (o) { function F() {}; F.prototype = o; return new F(); }; }
しかし、その影響は何ですか?知っておくべき落とし穴はありますか?