JS_对象原型链


## 面向对象  extends

    -实例属性,公共属性

//实例属性

function Person(){

    this.name = 'zs'; 

}

let p1 = new Person();

p1.name;

//公共属性

Person.prototype.eat = function(){

    console.log('');

}

p1.eat();

//代码复用

function Student() {

    //Person();  //错误用法

    Person.call(this);

}

let s1 = new Student; // = new Student();

============================传参=========================

## 面向对象  extends

    -实例属性,公共属性

//实例属性

function Person(name){

    this.name = 'zs'; 

}

let p1 = new Person('macro');

p1.name;

//公共属性

Person.prototype.eat = function(){

    console.log('');

}

p1.eat();

//代码复用

function Student(name) {

    //Person();  //错误用法

    Person.call(this,name);  //支持传参

    Person.apply(this,[name]);  // apply传参必须是数组对象

}

let s1 = new Student('macro');

==========================原型链查找机制==============================

?如何继承公共属性:eat()

prototype & __proto__

[1]每个函数都一个属性名字:prototype(原型),值是一个对象(引用)——但是普通函数没有很大意义; 字符串等其他则没有

[2]绝大多数对象都有__proto__属性,指向所属类的原型(即:构造函数的原型)

    ex: s1.__proto__ === Student.prototype

        'macro'.__proto__ === String.prototype

        [].__proto__ === Array.prototype

        s1.__proto__.__proto__ === Object.prototype

        Object.prototype.__proto__ = null  //终止循环

        Object.__proto__ === Function.prototype

        Function.__proto__ === Function.prototype

        Object.__proto__ === Function.__proto__

    原型 constructor 指向 构造函数

        s1.constructor  ===  Student.prototype.constructor

[3]

  -直接对子类原型赋值有问题

    Student.prototype = Person.prototype;

    缺点:更改Student的原型

    Student.prototype.constructor = Student;

    缺点:更改Person的原型

  -3种比较合适的方法:

[1]Student.prototype.__proto__ = Person.Prototype;

        Student.prototype.study = function(){

            log('working hard');

        }

        -相当于原型链

[2]Object.create()

        Student.prototype = Object.create(Person.prototype);

        // __proto__ : Person.prototype

        function create(parentProtype){

            function Fn(){}

            Fn.prototupe = parentProtype;

            return new Fn();

        }

        Student.prototype = Object.create(Person.prototype) //

                                __proto__

        s1.eat(); // === new Fn() --> Fn.prototype === parentPrytype

        所有:缺点: 是Student.constructor === Person

        改进:

            Student.prototype = Object.create(Person.prototype,{

                constructor:{

                    value:Student

                }

            });

    [3] setPrototypeOf 

        Object.setPrototypeOf(s1,Person.prototype)

猜你喜欢

转载自www.cnblogs.com/macro-renzhansheng/p/13196150.html