この記事は、javascript に関する関連知識を提供します。主に、プロトタイプの概念、関数プロトタイプのコンストラクター属性、プロトタイプ チェーンの理解など、プロトタイプとプロトタイプ チェーンに関連する問題を整理しています。 、以下で見てみましょう。皆さんの参考になれば幸いです。
[関連する推奨事項: JavaScript ビデオ チュートリアル、Web フロントエンド]
JavaScript では、関数はプロパティとメソッドを含む Function
型のオブジェクトです。プロトタイプ (Prototype)
は、Function
型オブジェクトの属性です。
prototype
属性は関数の定義時に含まれ、その初期値は空のオブジェクトです。 JavaScript の関数にはプロトタイプの型が定義されていないため、プロトタイプは任意の型にすることができます。
プロトタイプは、オブジェクトの共有プロパティとメソッドを保存するために使用されます。プロトタイプのプロパティとメソッドは、関数自体のプロパティとメソッドには影響しません。
// Function类型的属性->所有函数都具有的属性 console.log(Function.prototype);//[Function] // 定义函数 function fn() { console.log('this is function'); } //原型的默认值是空对象 console.log(fn.prototype);//fn {} // 函数包含构造函数 ——> 所有引用类型其实都是构造函数 console.log(Number.prototype); //[Number: 0] console.log(Object.prototype);//{}
属性を通じて
(obj) メソッドを通じて。
#function fn() { console.log('this is function'); } //使用访问对象的属性语法结构 console.log(fn.prototype);//fn {} console.log(fn['prototype']);//fn {} //Object类型提供getPrototypeOf()方法 console.log(Object.getPrototypeOf(fn));//[Function]
メソッドは次のとおりです。オブジェクト自身のすべてのプロパティの記述子を取得するために使用されます。 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">var result = Object.getOwnPropertyDescriptor(Object.prototype,'constructor');
console.log(result) //输出结果如下:
//{
// value: [Function: Object],
// writable: true,
// enumerable: false,
// configurable: true
// }</pre><div class="contentsignin">ログイン後にコピー</div></div>
コンストラクターは関数の作成時に自動的に追加され、コンストラクター自体を指します4. プロパティとメソッドを設定します。プロトタイプ
##プロトタイプのプロパティとメソッドは個別に定義されます。
构造函数.prototype.属性名 = 属性值 ;构造函数.prototype.方法名 = function(){} ;
を直接変更できます。すべてのオブジェクトには、To を使用するprototype
<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">构造函数.prototype = { 属性名:属性值, 方法名:function(){}}</pre><div class="contentsignin">ログイン後にコピー</div></div> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">function foo () {}foo.prototype = { constructor: foo, name: 'jam', age: 18, address: '北京市'}var fn = new foo()console.log(fn.address) // 北京市</pre><div class="contentsignin">ログイン後にコピー</div></div>
5.isPrototypeOf() メソッド
示例代码如下: // 通过初始化器方式定义对象 var obj = { name:'jam' } // 定义构造函数 function Hero() {} // 将对象obj赋值给构造函数Hero的原型 Hero.prototype = obj; // 通过构造函数创建对象 var hero = new Hero(); // isPrototypeOf()方法判断指定对象是否是另一个对象的原型 var result = obj.isPrototypeOf(hero); console.log(result);//true
objオブジェクトがhero
オブジェクトのプロトタイプであることを確認しました
2. プロトタイプ チェーン
场景:查找obj对象身上的address属性 js执行的步骤: 1. 会触发get操作 2. 在当前的对象中查找属性 3. 如果没有找到,这个时候会去原型链(__proto__)对象上查找 1. 查找到结束 2. 没查找到一直顺着原型链查找,直到查找到顶层原型(顶层原型是什么暂时卖个关子)
var obj = { name: 'jam', age: 19 } /* 要求:查找obj对象身上的address属性 */ // 原型链一层一层向上查找,如果一直没有找到,直到查找到顶层原型结束 obj.__proto__ = {} obj.__proto__.__proto__ = {} obj.__proto__.__proto__.__proto__ = { address: '北京市' } console.log(obj.address) // 北京市 console.log(obj.__proto__.__proto__.__proto__) // { address: '北京市' }
最終的にアドレス属性を見つける
ここで問題が発生します。それは見つからない、それは無限に続くでしょう、それを探していますか?次に、上で述べたように、プロトタイプ チェーンに沿って無限に検索するわけではなく、最上位のプロトタイプが見つかった場合、まだ見つかっていない場合は
#2 を見てみましょう。トップレベルのプロトタイプとは何ですか?
それでは、トップレベルのプロトタイプとは何でしょうか?
サンプル コードは次のとおりです: var obj = { name: 'jam' }console.log(obj.__proto__) // {}console.log(obj.__proto__.__proto__) // null
リテラル オブジェクト obj のプロトタイプは:
です。{}
は最上位プロトタイプです
__proto__
の出力を続けると、null 値が返されます。これは、上位層がすでに最上位プロトタイプであることを証明します次の図は、コードの最初の部分に欠けている最上位のプロトタイプを補足したものです。 -レベルのプロトタイプは Object.prototype
3.Object のプロトタイプ (Object.prototype)
3.1 では、プロトタイプ チェーンの終点はどこでしょうか?たとえば、3 番目のオブジェクトにも、prototype上記の出力結果は__proto__
属性がありますか?
var obj = {name:'jam'}obj.__proto__ = {}obj.__proto__.__proto__ = {}obj.__proto__.__proto__.__proto__ = {}console.log(obj.__proto__.__proto__.__proto__.__proto__) // {}ログイン後にコピー
実際、このプロトタイプはトップレベル プロトタイプ<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">var obj = {
name: 'jam',
age: 19
}
console.log(obj.__proto__) // {}
console.log(Object.prototype) // {}
console.log(obj.__proto__ === Object.prototype) // true</pre><div class="contentsignin">ログイン後にコピー</div></div>
Object はすべてのクラスの親クラスです
console.log(obj.__proto__ === Object.prototype) // true
結果の Object.prototype がトップレベルのプロトタイプであることがわかります。
{}プロトタイプの何が特別ですか?{}
3.2 次に、次のように尋ねます:
console.log(obj.__proto__.__proto__.__proto__.__proto__.__proto__) // null
Object.prototype
的结果为空对象{},但它不是空的,只是里面的属性不可枚举而已,例如我们就打印constructor
属性看看<!-- 可以看出是有constructor属性的 ,并不是空的-->console.log(Object.prototype.constructor) // [Function: Object] <!-- constructor 指回了Object -->
Object.getOwnPropertyDescriptors()
方法获取Object.prototype
中的所有自身属性的描述符。console.log(Object.getOwnPropertyDescriptors(Object.prototype)) // 如下长截图所示
【相关推荐:javascript视频教程、web前端】
以上がJavaScript プロトタイプとプロトタイプ チェーンの知識ポイントの詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。