プロトタイプ、プロトタイプチェーン
1.プロトタイプのコンセプト
すべてのJavaScriptオブジェクトには、独自のプロトタイプに対応する[proto]内部プロパティが含まれています。
プロトタイプ[proto]に加えて、JavaScript関数オブジェクトにもプロトタイププロパティがあります。関数オブジェクトがインスタンスを作成するためのコンストラクタとして使用される場合、プロトタイププロパティ値はインスタンスオブジェクトのプロトタイプ[proto]として使用されます。
すべてのオブジェクトにはプロトタイプと呼ばれる特別なプロパティがあり、プロトタイプで定義されたプロパティとメソッドはすべてのインスタンスオブジェクトによって共有されます。
//原型的代码理解
let zhangsan=new Person()
let lisi=new Person()
console.log(zhangsan.name) //undefind
console.log(lisi.name)//undefind
zhangsan.name='张三'//给张三改变值
zhangsan.name//张三
lisi.name//undefind
Person.prototype.name='王五'
lisi.name//王五
zhangsan.name//张三 (没有变是因为它是实例化属性)
delete zhangsan.name//把它删了
zhangsan.name//王五
zhangsan.children//[](是一个数组)
zhangsan.children.push('崔鑫琦')//1 (添加一个)
zhangsan.children//['崔鑫琦']
lisi.children//['崔鑫琦']
lisi.children.push('小琦')//2(添加一个)
lisi.children//['崔鑫琦','小琦']
zhangsan.children//['崔鑫琦','小琦']
var wangwu=new Perosn//undefind
wangwu.children//['崔鑫琦','小琦']
Person.prototype.sayName=function(){
//在原型上创建了一个方法
console.log('我叫小崔')
}
wangwu.sayName()//我叫小崔
zhangsan.sayName()//我叫小崔
第二に、プロトタイプチェーンの概念
オブジェクトのプロパティにアクセスするときは、最初に基本プロパティを検索します。そうでない場合は、プロトタイプチェーンである__proto__チェーンに沿って検索します。
説明:
オブジェクトがそれ自体に存在しないプロパティ/メソッドを呼び出すと、オブジェクトはその[proto]に関連付けられた先行プロトタイプオブジェクトに移動してそれを見つけます。見つからない場合は、関連付けられたプロトタイプv = ['proto]に移動します。前任者のプロトタイプそれを見つけに行きます。プロパティ/メソッドまたは未定義が見つかるまで、以下同様です。このようにして、いわゆる「プロトタイプチェーン」が形成されました。