主にこれらの概念を明確にします。
- 継承(プロトタイプ、プロトタイプチェーン、プロトタイプ、プロトタイプ、新規)
- instanceofとisprototypeofの違い
1.コンセプト
1.1JavaScript継承のソース
JavaScriptのプロトタイプ継承の原理と理由を常に覚えているとは限らず、頭が混乱しやすいです。Ruan Yifengの記事を検討した後、私はそれを次のように要約しました。
- 最初はスクリプト言語が必要であり、複雑にする必要はありません。
- 当時、Javaは非常に人気があり、Javaはオブジェクトオブジェクトを使用していました。そこで、オブジェクトオブジェクトを使用することにしました。
- c ++とjavaの両方に、オブジェクトを作成するためのnewがあり、javascriptもnewを参照します。
- しかし、newを単純化するために、javascriptのnewのオブジェクトはコンストラクター、つまり関数です。
- しかし、newにはデータを共有できないという欠点があるため、プロトタイプが出てきて、プライベートデータがコンストラクターにあり、共有データがプロトタイプにあります。
function dog(name){
this.name = name
}
dog.prototype = {
type:"animate"
}
var a = new dog('gou')
var b = new dog('mao')
dog.prototype.type = 'dongwu';
console.log(a.name); // gou
console.log(b.name); // mao
console.log(a.type); // dongwu
console.log(b.type); // dongwu
1.2プロトタイプチェーンの概念
この絵を入れないといけない(^ _ ^)
以下は私が理解している概念です:元の概念はここで見ることができます
- インスタンスオブジェクトには__proto__属性があります(コンストラクターのプロトタイプオブジェクトを指します)
- 関数にはプロトタイプ属性があります
- 関数のプロトタイプはオブジェクトタイプです
- __proto__属性は関数のプロトタイプオブジェクトを指し、prototypeは関数のプロトタイプオブジェクトです。
- Object .__ proto__ === Function .__ proto__ === foo .__ proto__ === Function.prototype
私が理解しているプロトタイプチェーン:
javascriptのすべてがオブジェクトです。各インスタンスオブジェクトには、コンストラクターのインスタンスオブジェクト(プロトタイプ)を指す__proto__属性があり、インスタンスオブジェクトはオブジェクトであるため、nullになるまで__proto__属性があります。プロトタイプチェーンの生成。
ps:なぜ__proto_属性を使用するのか、この記事の下部にあるnewの実装を参照できます。_
光の概念は良くありません、そして2つの栗があります:
Function.prototype.a = 'Function'
Object.prototype.a = 'Object'
function foo(name){
}
var a = new foo();
console.log(a.a) // Object
// 原型链从__proto__开始查找,
// 步骤:foo.__proto__ ---> foo.prototype ---> Object.prototype
// 结果: Object, 根本未经历Function.prototype
function foo(){
}
var a = new foo();
console.log(a.__proto__ === foo.prototype); // true, proto指向声明它的原型的prototype
console.log(foo.__proto__ === Function.prototype) // true, function声明变量的proto指向Function.prototype
console.log(Function.prototype.__proto__ === Object.prototype); // true, prototype也有proto,指向Object的prototype
console.log(Object.prototype.__proto__ === null); //true, Object的prototype的proto指向null
ps:権威あるウェブサイトにアクセスして、いくつかの独自の概念を確認することをお勧めします。これはより良い方法です。
3.インスタンスの
BのinstanceofはA
ステートメント1:かどうかは、Bのコンストラクタのプロトタイプオブジェクトは、のプロトタイプチェーン上にある
安全2:Aのオブジェクトは、Bオブジェクトのインスタンスである
安全3:Bのオブジェクトは、Aのオブジェクトの親オブジェクトである
私は考えますステートメント2が最も適切です
偽のコード:
function instanceof(left,right){
while(true){
if(left.__proto__ === null){
return false;
}
if(left.__proto__ === right.prototype){
return true;
}
left = left.__proto__;
}
}
エラーが発生しやすい小さな栗:
var simpleStr = "This is a simple string";
var myString = new String();
var newStr = new String("String created with constructor");
simpleStr instanceof String; // 返回 false, 检查原型链会找到 undefined
myString instanceof String; // 返回 true
newStr instanceof String; // 返回 true
myString instanceof Object; // 返回 true
Object.create(null) instanceof Object // false, 创建了一个原型为null的空对象,检查原型链会找到 undefined
エラーが発生しやすい小さな栗2:isprototypeofとの違い(答えはすべて正しい)
var fn = function(){
this.nick = 'nick'
this.age = '18'
}
fn.prototype.getNick = function(){
console.log(this.nick)
}
fn.hello = function(){
console.log('hello')
}
fn.getAge = function(){
console.log(this.hello())
return '1'
}
var sub = function(){
}
sub.prototype = Object.create(fn.prototype)
sub.prototype.constructor = sub;
var sb = new sub();
console.log(sb instanceof fn)
console.log(fn.prototype.isPrototypeOf(sb))
var c = Object.create(fn.prototype)
console.log(c instanceof fn)
console.log(fn.prototype.isPrototypeOf(c))
var obj = {
a:'a'
}
var t = Object.create(obj)
console.log(t instanceof Object)
console.log(Object.prototype.isPrototypeOf(t))
4.isprototypeof
A.isPrototypeOf(B):
BオブジェクトがAのプロトタイプチェーン上にあるかどうか
var o={
};
function Person(){
};
var p1 =new Person();//继承自原来的原型,但是现在已经无法访问
Person.prototype=o;
var p2 =new Person();//继承自o
console.log(o.isPrototypeOf(p1));//false o不是p1的原型
console.log(o.isPrototypeOf(p2));//true o是p2的原型
// 这个栗子来源于网上,我稍微修改了一下。我认为这个栗子并不好,
// 因为实际使用一般是o.prototype.isPrototypeOf(p2),而非o.isPrototypeOf(p2)
5.instanceofとisprototypeofの違い
パラメーター間の違いはパラメーター間の違いでは
ないと思いますが、後者はより包括的です(コンストラクターで検出できます)。コンストラクターprototypeObject.isPrototypeOf(Object)の
パラメーター
オブジェクトインスタンス間の違いです。
6.新規
引用元:住所
function myNew(){
var constructor = [].shift.call(arguments); //注意是shift,不是slice
var obj = new Object();
obj.__proto__ = constructor.prototype;
constructor.apply(obj,arugments)
return obj;
}