자세한 프로토 타입 프로토 타입 체인

프로토 타입 체인

  • (문)가 객체 생성 방법은 여러 가지가 있습니다
  • 프로토 타입 생성자 예를 들어, 프로토 타입 체인
  • instanceof 원리
  • new 연산자

A. 객체를 생성하는 방법에는 여러 가지가 있습니다

1. 문자

var test2 = {x:123,y:345};
console.log(test2);//{x:123,y:345};
console.log(test2.x);//123
console.log(test2.__proto__.x);//undefined
console.log(test2.__proto__.x === test2.x);//false

2. 생성자 새로운

// 方法1 #通过new Object声明的一个对象
var test1 = new Object({x:123,y:345});
console.log(test1);//{x:123,y:345}
console.log(test1.x);//123
console.log(test1.__proto__.x);//undefined
console.log(test1.__proto__.x === test1.x);//false

// 方法2  #使用显式构造函数创建对象
var M = function(name){ this.name = name;};
var o3 = new M('o3');  //M {name: "o3"}

새로운 역할 : 1. 새 객체를 생성은, 포인트 생성자를 2.이 3. 생성자가 돌아왔다, 그것은이다 새 개체를 대체 할 밖으로 새로운 객체 경우

3. 내장 방법

Obejct.create(obj,descriptor)그것은 개체의 OBJ입니다 (옵션) 설명 속성은, 지정된 프로토 타입 객체를 생성 설명하고 선택적으로 지정된 속성이 포함되어 있습니다.

let p = {x:123,y:345};
let test = Object.create(p);
console.log(test);//{}
console.log(test.x);//123
console.log(test.__proto__.x);//3
console.log(test.__proto__.x === test.x);//true
console.log(test.__proto__ === p)  // true

Object.create이 매개 변수는 새 개체 프로토 타입 객체가 할당되는 object입니다 test,되는 test프로토 타입 객체의 프로토 타입 체인에 의해 연결되어, 그 자체가이 속성을 가지고 있지 않습니다. 그래서 ( test오브젝트 자체의 이름이없는 속성 이름의 속성은 프로토 타입 체인을 통해 올 수 있습니다.

세 가지 방법의 장점과 단점

  1. 기능 : 선언의 대상 및 할당 할 능력과 가치를 얻을 수 있습니다
  2. 상속 : 내장 방법 개체 속성 __proto__의 후계자를 만들 수 있습니다
  3. 숨겨진 속성 : 세 가지 방법이 몇 가지 숨겨진 속성을 생성하기 위해 내부 (속성 또는 메서드)의 각 구성원에 대한 기본을 선언합니다, 이러한 특성은 읽을 수 및 숨기기 설정, 속성 분류는 다음을 참조 :
  4. 속성은 읽기 :Object.getOwnPropertyDescriptor()或getOwnPropertyDescriptors()
  5. 속성 설정 :Object.definePropertype或Object.defineProperties

프로토 타입 체인의 II. 관계

도 신중 원형, 생성자, 객체 인스턴스, 원형 고리의 관계를 관찰한다.

관계의 프로토 타입 체인

1. 객체 인스턴스

한 객체가 인스턴스로, 객체를 생성하는 위의 여러 가지 방법을 검토는, 객체의 인스턴스는 암시 적 프로토 타입이 __proto__객체를.

2. 생성자

키워드 new동작 뒤에 함수는이 함수는 생성자, 정확 이러한 기능만큼 후자의 기능의 새로운 사용의 생성자를 호출 할 수 있다고 할 수 있습니다.

생성자 수 new오퍼레이터는 인스턴스를 생성하는 단계;

3. 프로토 타입 객체

모든 기능은이 prototype속성을 그 고유의 기능이있다 prototype명시 적 프로토 타입 객체를 참조;

개체의 모든 인스턴스는이 __proto__개체를. 그는이 고유 한 목적은 __proto__암시 적 프로토 타입 객체를 참조;

__proto__프로토 타입 체인은 실제로 항상 가리키는 쿼리에 사용됩니다 prototype;

prototype당신이 생성자를 정의 할 때 자동으로 생성 고유의 기능은,인가, 그것은 항상 __proto__언급했다.

4. 프로토 타입 체인

각 객체는 프로토 타입을 가질 수 있습니다 _proto_,이 프로토 타입은 프로토 타입 체인을 형성, 그래서 자신의 프로토 타입을 가지고 할 수 있습니다. 특정 속성을 찾기, 우리는이 객체를 찾아 가서하지 않을 경우, 다음의 프로토 타입 객체에 들어갔다, 또는하지 않을 경우, 다음 프로토 타입 객체 프로토 타입 객체의 이동을 알고 말을 찾고 가고 null......이 작업이 전체 프로토 타입 체인에 위임되었다, 이것은 우리가 프로토 타입 체인 부르는

이 그것의 과정을 보면 무엇 프로토 타입 체인을 달성하기 위해?
프로토 타입 및 프로토 타입 __proto__ 속성을 통해 이러한 목표를 달성하기 위해 프로토 타입 체인을 찾기;

IMG

let obj1 = {name:'lucas'};   
obj1.__proto__ === Object.prototype  // true
obj1.__proto__.__proto__            // null  #这是原型链顶端了
Object.prototype.__proto__          // null #这是原型链顶端了

function Person(){}
Person.prototype.__proto__.__proto__  // null #这是原型链顶端了

let person = new Person();
person.__proto__.__proto__.__proto__  // null #这是原型链顶端了
person.__proto__  === Person.prototype  // true
function M (name) { 
    this.name = name; 
}//person是构造函数

var o3 = new M('o3') // personTwo是实例

자세한 프로토 타입 관계

프로토 타입 객체의 속성은 기본 생성자 포인트 생성자가

세 가지. instanceof를 원칙

instanceof주로 특정 유형의 인스턴스가 또한 유형의 인스턴스는 상위 또는 부모 타입의 인스턴스인지를 결정하는데 사용될 수 있는지 결정하는 데 사용.

instanceof주요 원리는 프로토 변수 권리 prototype 체인 변수에 남아있을 수있는만큼 달성하는 것이다. 따라서, instanceof당신이 바로 프로토 타입 변수를 찾을 때까지 검색 과정에서 그 실패하면 false를 반환, 왼쪽에있는 프로토 타입 체인 변수를 통과합니다.

实例对象上有__proto__这个属性,实例对象的这个属性引用是它构造函数的原型对象(也就是找到的这个构造函数);
构造函数有prototype这个属性,这个属性引用的原型对象,在往下走,实例对象的__proto__这个属性,其实是引用这个原型对象。

instanceof를 회로도

아날로그 instanceof를 개발

function instanceof(left, right) {
    const rightVal = right.prototype
    const leftVal = left.__proto__
    // 若找不到就到一直循环到父类型或祖类型
    while(true) {
        if (leftVal === null) {
            return false
        }
        if (leftVal === rightVal) {
            return true
        }
        leftVal = leftVal.__proto__ // 获取祖类型的__proto__
    }
}

네. 새로운 연산자

new 연산자

var new2 = function(func){

    //1.创建一个空对象,这个对象要继承这个构造函数的原型对象(空对象要关联构造函数的原型对象;)
    let o = Object.create(func.prototype);
    
    //2.执行构造函数
    let k = func.call(o);//call用来转移上下文(this),把这个上下文转成o对象
    
    //3.判断构造函数的运行结果是不是对象类型
    if(typeof k ==='object'){
        return k;
    }else{
        return o;
    }
 };

추천

출처www.cnblogs.com/jing-tian/p/12244374.html