A、プロトタイプ
JavaScriptでは、各プロトタイプの機能は、その機能のプロトタイプオブジェクトへのポイント性質を有しています。
例えば:
機能人(年齢){ this.age =年齢 } Person.prototype.name = 'kavin' VAR PERSON1 =新しい人() VAR PERSON2 =新しい人() はconsole.log(person1.name)// kavin はconsole.log( person2.name)// kavin
上記の例では、プロトタイプ関数オブジェクトを指し、それはPERSON1とPERSON2のプロトタイプであり、このオブジェクトのコンストラクタを呼び出しているときに、プロトタイプインスタンスを作成します。
プロトタイプのコンセプト:(ヌルを除く)すべてのjavascriptオブジェクトの作成と、彼らは、我々は、プロトタイプから、各オブジェクトは意志「継承」属性のプロトタイプを呼んで別のオブジェクトに関連付けられます。
私たちは、コンストラクタとプロトタイプマップとインスタンス間の関係を表現してみましょう:
二、__ proto__
(ヌルを除く)各オブジェクトは、__proto__プロパティと呼ばれる、のために持っているだろうことがあり、このプロパティは、オブジェクトのプロトタイプを指します。
機能人(){ } VAR人=新しい人(); console.log(人.__ proto__ === Person.prototype)。//真
図:
追加情報:
ブラウザの大半は、プロトタイプにアクセスするには、この非標準的な方法をサポートしていますが、それは実際にPerson.prototypeに存在しない、それはのObject.prototype、そんなに財産、から来ていることは、ゲッター/セッターであるとして、 OBJ .__ proto__使用する場合には、リターンObject.getPrototypeOf(OBJ)として理解することができます。
三、コンストラクタ
各プロトタイプは、コンストラクタにポイントに関連付けられているconstructorプロパティを持っています。
機能人(){ } はconsole.log(人物=== Person.prototype.constructor)//真
それでは、次の更新グラフ:
人関数(){ } VAR =新たな新しい人の人(); 真//にはconsole.log(人.__ proto__ == Person.prototype) 真//にはconsole.log(== Person.prototype.constructor人) 学習する//方法ES5方法、オブジェクトを取得することができるプロトタイプ はconsole.log(Object.getPrototypeOf(人)=== Person.prototype )//真
追加情報:
機能人(){ } VAR人=新しい人(); console.log(person.constructor ===人)。//真
当获取 person.constructor 时,其实 person 中并没有 constructor 属性,当不能读取到constructor 属性时,会从 person 的原型也就是 Person.prototype 中读取,正好原型中有该属性,所以:
person.constructor === Person.prototype.constructor
四、实例与原型
当读取实例的属性时,如果找不到,就会查找与对象关联的原型中的属性,如果还查不到,就去找原型的原型,一直找到最顶层为止。
function Person() { } Person.prototype.name = 'Kevin'; var person = new Person(); person.name = 'Daisy'; console.log(person.name) // Daisy delete person.name; console.log(person.name) // Kevin
在这个例子中,我们给实例对象 person 添加了 name 属性,当我们打印 person.name 的时候,结果自然为 Daisy。
但是当我们删除了 person 的 name 属性时,读取 person.name,从 person 对象中找不到 name 属性就会从 person 的原型也就是 person.__proto__ ,也就是 Person.prototype中查找,幸运的是我们找到了 name 属性,结果为 Kevin。
但是万一还没有找到呢?原型的原型又是什么呢?
五、原型的原型
在前面,我们已经讲了原型也是一个对象,既然是对象,我们就可以用最原始的方式创建它,那就是:
VAR OBJ =新しいオブジェクト(); obj.name = 'ケビン' にconsole.log(obj.name)//ケビン
私たちは次の図を更新しますので、実際には、Objectコンストラクタによって生成されるプロトタイプオブジェクトは、__proto__コンストラクタのプロトタイプの例に指して、組み合わせの前に話さ:
第六に、プロトタイプチェーン
単にコンストラクタ、プロトタイプ及び例との関係を見て:各コンストラクタ関数は、プロトタイプオブジェクトを有する、プロトタイプオブジェクトは、コンストラクタを指し示すポインタを含み、インスタンスはプロトタイプオブジェクトへの内部ポインタを含みます。我々はプロトタイプオブジェクトは、タイプの別のインスタンスに等しい作るのであれば、何が起こりますか?明らかに、プロトタイプオブジェクトは、別のプロトタイプを指すポインタが含まれています。この時間は、それに対応し、別のプロトタイプはまた別のコンストラクタを指すポインタが含まれています。プロトタイプは、別のタイプの別の例であれば、上記の関係はまだ有効です。プログレッシブ層ので、チェーンとプロトタイプの例を構成します。これは、いわゆるプロトタイプチェーンの基本的な考え方です。 - 「JavaScriptの高度なプログラミング」からの抜粋
5つのプロセス - 実際には、単に、それは4です。
Object.prototypeがそれをプロトタイプという、前述した第五に続いて?
console.log(のObject.prototype .__ proto__ === NULL)//真
ルアンYifengは教師を引用し 、「未定義とnullの違いは」 次のとおりです。
nullの手段である「ノーオブジェクト」は、価値があるべきではありません。
だから、のObject.prototype .__ proto__なしプロトタイプとヌルのObject.prototypeで、実際に意味を表現しています。
プロパティを探してたときのObject.prototypeが検索停止することができました。
最後に、グラフもに更新することができます。
プロトタイプによる図鎖構造は、青い線であるプロトタイプチェーンを相互れます。