最も詳細なJSプロトタイプとプロトタイプチェーンの最終的な詳細は、「可能性は」というものがありません.(一)
5667 ワード
第二篇はすでに更新しました.クリックして第三編に更新しました.クリックしてください.
本の文章は全部更新しました.JSのプロトタイプとプロトタイプチェーンを完全に分析しました.これらの教程を通じて、Javascriptという言語に対する理解がもっと徹底的になりますように.
一.一般的なオブジェクトと関数オブジェクト
JavaScriptの中で、万物はすべて対象です.しかし、相手にも違いがあります.一般的なオブジェクトと関数オブジェクトに分けられ、Object、FunctはJSの関数オブジェクトです.次に例をあげて説明します
普通のオブジェクトと関数のオブジェクトをはっきり区別しなければなりません.以下はよく使います.
二.構造関数
まず構造関数の知識を復習します.
三.原型の対象
JavaScriptでは、一つのオブジェクト(関数も対象)を定義するたびに、オブジェクトの中に予め定義されている属性が含まれます.各関数オブジェクトには
上で私達はAに4つの属性を追加しました.name、age、job、sayName.実はもう一つのデフォルト属性があります.
上記の言葉はちょっと言いにくいですが、私達は「翻訳」してみます.Aは標準的な
この二つの「公式」はちょっと連絡があるようです.
プロトタイプのオブジェクトは通常のオブジェクトです.関数オブジェクトですが、プロトタイプ属性はありません.次の例を見てください.
その原型の対象は何に使いますか?主な役割は継承のためです.例を挙げます
上の二つのthisは誰を指しますか?
2017-10-27更新:以下のコメントに「人」があります.「nullはproto_がない」という質問がありますが、以下に説明します.nullは独立したデータタイプです.なぜtypeof(null)の値は「object」ですか? nullは空の引用ではなく、元の値です.ECMAScript 5.1中国語版*4.3.11節を参照してください.ここで一つの対象を引用することを期待しています.期待しています.null-JavaScript*. を参照してください. typeof null結果はobjectであり、これは歴史的なバグであり、参照typeof-JavaScript** ECMA 6では、以前は歴史が平凡で、type nullの値をnullに訂正するという提案がありましたが、最後の提案は拒否されました.歴史的な遺留コードが多すぎて、人を怒らせたくないからです.むしろ、間違ってもいいです.hanomory:typeof_を参考にしてください.null[ES Wiki]著者:クリリンリンク:https://www.zhihu.com/question/21691758/answer/987822 2019-04-15更新:先端を学びたいなら連絡してください.
焦らないでください.プロトタイプとプロトタイプについては第二編と第三編があります.第二編はすでに更新されました.クリックして第三編に入って更新しました.クリックしてください.
本論文はJSプロトタイプとプロトタイプチェーンの最終的な詳細を参照しました.
この一連の課程を通して、JavaScriptのプロトタイプとプロトタイプチェーンを徹底的に理解できるようにしたいです.)
本の文章は全部更新しました.JSのプロトタイプとプロトタイプチェーンを完全に分析しました.これらの教程を通じて、Javascriptという言語に対する理解がもっと徹底的になりますように.
一.一般的なオブジェクトと関数オブジェクト
JavaScriptの中で、万物はすべて対象です.しかし、相手にも違いがあります.一般的なオブジェクトと関数オブジェクトに分けられ、Object、FunctはJSの関数オブジェクトです.次に例をあげて説明します
var o1 = {};
var o2 =new Object();
var o3 = new f1();
function f1(){};
var f2 = function(){};
var f3 = new Function('str','console.log(str)');
console.log(typeof Object); //function
console.log(typeof Function); //function
console.log(typeof f1); //function
console.log(typeof f2); //function
console.log(typeof f3); //function
console.log(typeof o1); //object
console.log(typeof o2); //object
console.log(typeof o3); //object
上記の例ではo 1 o 2 o 3は一般的なオブジェクトであり、f 1 f 2 f 3は関数オブジェクトである.どのように区別しますか?実は簡単です.new Functionによって作成されたオブジェクトはすべて関数オブジェクトで、他のオブジェクトはすべて普通のオブジェクトです.f 1,f 2は、結局はnew Function()で作成されます.Function ObjectもNew Functionで作成されます.普通のオブジェクトと関数のオブジェクトをはっきり区別しなければなりません.以下はよく使います.
二.構造関数
まず構造関数の知識を復習します.
function Person(name, age, job) {
this.name = name;
this.age = age;
this.job = job;
this.sayName = function() { alert(this.name) }
}
var person1 = new Person('Zaxlct', 28, 'Software Engineer');
var person2 = new Person('Mick', 23, 'Doctor');
上記の例では、person 1とperson 2はいずれもPersonの例である.これらの2つの例はいずれも1つのconstructor
(構成関数)属性を有し、この属性(ポインタ)はPersonを指す.すなわち、 console.log(person1.constructor == Person); //true
console.log(person2.constructor == Person); //true
私たちは二つの概念(コンストラクション、例)を覚えます.person 1とperson 2はいずれもコンストラクションPersonの実例となる公式です.例のコンストラクター属性はコンストラクタを指します.三.原型の対象
JavaScriptでは、一つのオブジェクト(関数も対象)を定義するたびに、オブジェクトの中に予め定義されている属性が含まれます.各関数オブジェクトには
prototype
属性があり、この属性は関数のプロトタイプオブジェクトを指す.(とりあえず何を使っても__proto__
第二節の授業は詳しく分析します)function Person() {}
Person.prototype.name = 'Zaxlct';
Person.prototype.age = 28;
Person.prototype.job = 'Software Engineer';
Person.prototype.sayName = function() {
alert(this.name);
}
var person1 = new Person();
person1.sayName(); // 'Zaxlct'
var person2 = new Person();
person2.sayName(); // 'Zaxlct'
console.log(person1.sayName == person2.sayName); //true
本稿の最初の「法則」を得た. __proto__ , prototype
原型の対象は何ですか?上の例を改めたら分かります.Person.prototype = {
name: 'Zaxlct',
age: 28,
job: 'Software Engineer',
sayName: function() {
alert(this.name);
}
}
原型の対象は名前の通り普通の対象です.今から原型の対象がPerson.prototypeであることをしっかり覚えてください.もしあなたがまだそれを恐れるなら、それをアルファベットAにしたいです.上で私達はAに4つの属性を追加しました.name、age、job、sayName.実はもう一つのデフォルト属性があります.
var A = Person.prototype
デフォルトでは、すべてのプロトタイプオブジェクトが自動的に1つのconstructor
属性を獲得します.この属性は、constructor
属性がある関数(Person)を指します.上記の言葉はちょっと言いにくいですが、私達は「翻訳」してみます.Aは標準的な
prototype
属性を持っています.この属性はポインタで、Personを指しています.constructor
上の第二小節の「コンストラクタ」では、実例のコンストラクタ属性がコンストラクタを指していることを知っています.この二つの「公式」はちょっと連絡があるようです.
person1.constructor == Person
Person.prototype.constructor == Person
person 1はなぜconstructor属性がありますか?それはperson 1がPersonの実例だからです.Person.prototypeはなぜconstructor属性がありますか?同じように、Person.prototypeもPersonの例です.つまりPersonが作成されたときに、そのインスタンスオブジェクトを作成し、そのプロトタイプに値を付けます.基本的なプロセスは以下の通りです. var A = new Person();
Person.prototype = A;
// : ,
結論:プロトタイプオブジェクト(Person.prototype)は構成関数(Person)の一例である.プロトタイプのオブジェクトは通常のオブジェクトです.関数オブジェクトですが、プロトタイプ属性はありません.次の例を見てください.
function Person(){};
console.log(Person.prototype) //Person{}
console.log(typeof Person.prototype) //Object
console.log(typeof Function.prototype) // Function,
console.log(typeof Object.prototype) // Object
console.log(typeof Function.prototype.prototype) //undefined
Person.prototype.constructor == Person
はなぜ関数オブジェクトですか? var A = new Function ();
Function.prototype = A;
上記で述べたように、new Functionによって生成されるオブジェクトはすべて関数オブジェクトです.Aは関数オブジェクトであるため、person1.constructor == Person
は関数オブジェクトである.その原型の対象は何に使いますか?主な役割は継承のためです.例を挙げます
var Person = function(name){
this.name = name; // tip: this ?
};
Person.prototype.getName = function(){
return this.name; // tip: this ?
}
var person1 = new person('Mick');
person1.getName(); //Mick
この例から、Function.prototype
に関数オブジェクトの属性を設定することによって、Personの例(person 1)から出た一般的なオブジェクトがこの属性を継承していることが分かる.具体的にどのように継承されているかは、次のプロトタイプチェーンに言及します.上の二つのthisは誰を指しますか?
var person1 = new person('Mick');
person1.name = 'Mick'; // person1 name
person1.getName(); //Mick
したがって、2回のthisは関数実行時にperson 1を指します.2017-10-27更新:以下のコメントに「人」があります.「nullはproto_がない」という質問がありますが、以下に説明します.nullは独立したデータタイプです.なぜtypeof(null)の値は「object」ですか?
焦らないでください.プロトタイプとプロトタイプについては第二編と第三編があります.第二編はすでに更新されました.クリックして第三編に入って更新しました.クリックしてください.
本論文はJSプロトタイプとプロトタイプチェーンの最終的な詳細を参照しました.
この一連の課程を通して、JavaScriptのプロトタイプとプロトタイプチェーンを徹底的に理解できるようにしたいです.)