プロトタイプ、プロトタイプチェーン、instanceof、isprototypeofの詳細な説明

主にこれらの概念を明確にします。

  1. 継承(プロトタイプ、プロトタイプチェーン、プロトタイプ、プロトタイプ、新規)
  2. 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プロトタイプチェーンの概念

この絵を入れないといけない(^ _ ^)
JavaScriptプロトタイプチェーン

以下は私が理解している概念です:元の概念はここで見ることができます

  1. インスタンスオブジェクトには__proto__属性があります(コンストラクターのプロトタイプオブジェクトを指します)
  2. 関数にはプロトタイプ属性があります
  3. 関数のプロトタイプはオブジェクトタイプです
  4. __proto__属性は関数のプロトタイプオブジェクトを指し、prototypeは関数のプロトタイプオブジェクトです。
  5. 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;
}

おすすめ

転載: blog.csdn.net/a519991963/article/details/95505746