私はすべてのことを深く知る必要がある人です。だから私は教えられた多くの科目を通っています。私はプロトタイプ継承の深みに足を踏み入れました。
私はES5でどのように動作するかについて明確なビジョンを持っています(すべての関数には、この特殊なプロトタイププロパティがあり、それが基になっているオブジェクトを指しています。 。どのくらいES6クラスがES5スタイルと異なるのですか?
だから、今のは、ES5の例を見てみましょう:
function Bunny(name) {
this.name = name
}
Bunny.prototype.sayName = function() {
console.log('Im',this.name)
}
この1つはかなり明確である:機能バニーは、新しいオブジェクトに割り当てることになるだろう引数name
を取得します。
次の行は、現在の名前を返す関数のプロトタイプに関数を追加します。
さんは今ES6クラスを見てみましょう。ここ
class Fox{
constructor(name){
this.name = name;
}
sayName() {
console.log('Im', this.name)
}
}
同じもの:ここConstructor
は、私たちのバニー機能のようなものです。しかし、キツネのsayName
はバニーのsayName
と同じではありません。
のは、インスタンスを作成してみましょう:
let bunny = new Bunny('Henry');
let fox = new Fox('Jerry');
そして今は、彼らのプロトタイプを確認してください。
console.log(Object.getPrototypeOf(bunny))
console.log(Object.getPrototypeOf(fox))
我々は何を得るのですか?
//using repl.it - ES6
{ sayName: [Function] }
{}
なぜですか?
バニーのプロトタイプに直接機能sayName
を設定している可能性があると思いました。だから私はこれにそれを変更しました:
function Bunny(name) {
this.name = name
//Warning - Bad practice ahead!
this.sayName = function() {
console.log('Im',this.name)
}
}
結果:
意味console.log(bunny.hasOwnProperty('sayName'))
console.log(fox.hasOwnProperty('sayName'))
、fox
は上sayName
を所有していない:いないこの場合、意味を持っているでしょう
//using repl.it - ES6
{}
{}
彼のプロトタイプは、それがそれを持っていることを示しています。私はここに何かを逃していますかなぜ彼らは違うのですか?
なぜ2番目の例は悪い習慣ですか? – evolutionxbox
@evolutionxboxこれは、インスタンスごとに新しい関数を作成するためです。 –
'console.log'を使ってオブジェクトを検査しないでください。 'console.dir'を使います。 –