概念
1 JSのオブジェクトを通常のオブジェクトと関数オブジェクトに分割します
。2関数オブジェクトにはプロトタイププロパティがあります– Function.prototypeを除く–通常のオブジェクトにはこのプロパティがありません
。3すべての関数はFunction()コンストラクターのインスタンスです– Function.prototype = = fn / Function.prototype.prototype == ubdefined
4プロトタイプの主な機能-プロトタイプオブジェクトに追加されたすべてのプロパティとメソッドは、すべてのインスタンスオブジェクトによって共有されます-つまり、継承された
5つのオブジェクトにはプロト非表示のプロパティがあります-主流のブラウザにははい、開発者向けではありません
。6つのオブジェクトにはコンストラクター属性があります–属性値はオブジェクトのコンストラクターまたはクラスです
。7つのルートコンストラクターオブジェクト– Object.prototype.hh = 777->すべてのオブジェクトはhhにアクセスできます
。8つのプロトタイプチェーン-複数のプロトタイプ間の特別なアクセス関係です
。9prototype== JSプロトタイプオブジェクト/プロトブラウザに付属のプロトタイプオブジェクト
プロトタイプ間の関係
1 理解
1 obj.__proto__ == obj构造器的 prototype -- 一个对象可访问它原型链上的所有属性和方法
2 构造器的 __proto__ == ƒ () {
[native code] }
3 Object == 根构造器
4 Object.prototype == 原型链的末端 // 例 -- 所有对象可以使用 toString() 的原因就是, 该方法存在于原型链的末端
5 Object.prototype.__proto__ == null // 说明根构造器的原型对象没有构造器
2 常见场景
1 创建字符串 -- var str = "zhang"
2 原型指向 --> str.__proto__ == String.prototype
3 原型指向 --> String.prototype.__proto__ === Object.prototype //记住 String这类构造器的 __proto__ 就是直接指向原型链子末端的
4 原型指向 --> Object.prototype.__proto__ === null
4 案例解析
1 Object.prototype.hh = 77 --> var str = "zhang" --> console.log(str.hh) // 77
2 浏览器通过原型链查找 hh 属性过程
1 str.hasOwnProperty('abc') false
2 str.__proto__.hasOwnProperty('abc') false
3 str.__proto__.__proto__.hasOwnProperty('abc') true -> 返回 hh 的属性值 66
4 str.__proto__.__proto__ == String.prototype.__proto__ == Object.prototype
継承
1コンセプト
JSでの継承は、プロトタイプを通じて実現されます。プロトタイプのプロパティメソッドは、プロトタイプ自体のインスタンスオブジェクトプロトタイプチェーンで共有できます
。継承の2つの方法
1コンストラクターの継承には制限があります...
2プロトタイプの継承は不合理です...
3親オブジェクトと子オブジェクトのコピー継承が影響を受けます...
4混合継承に一般的に使用される継承方法
5クラス継承に一般的に使用される継承方法
3 -- 混合继承的实现方式