理解javascript原型链

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Donspeng/article/details/77254652

要理解javascript的原型链首先要明白javascript创建对象的方式
1、对象有数据属性和访问器属性,可以使用defineProperty来创建
数据属性具有四个特性:
Configurable:能够通过delete属性删除而重新定义属性,默认true
Enumerable:能够通过for in循环属性。默认true
Writable:能够修改
Value:包含的数据值
访问器属性有四个特性:
Configurable
Enumerable
Getter:读取属性,默认undefined
Setter:设置属性,默认undefined
2、创建对象
1)字面量

var s={}

2)Object构造函数

var obj=new Object();

3)工厂模式

function creatObj(){
    var o=new Object();
    o.name='hello';
    o.sayHello=function(){
        console.log("Hello World");
    }
    ......
    return o;
}
工厂模式的弊端在于我创建了什么对象我并不知道,我只知道我创建了对象

4)构造函数模式

function Person(){
    this.name='hello';
    this.phone='12345';
    this.sayHello=function(){
        console.log('Hello World');
    }
}
构造函数的弊端:方法没能够复用,会创建两次sayHello

5)原型模式

function Person(){
}
Person.prototype={
    name:'hello';
    phone:'12345';
    sayHello:function(){
        console.log(this.name);
    }
}
原型模式的弊端:所有的属性都共享了

6)构造函数和原型组合

function Person(){
    this.name='hello';
    this.phone='12345';
}
Person.prototype={
    sayHello:function(){
        console.log(this.name);
    }
}
通过构造函数共享属性,原型共享方法

3、有了对象,自然就存在对象之间的继承(OOP的必然)
目的是什么?

1、复用父对象的方法
2、子对象的属性和父对象无关联,子对象修改不会影响其他子对象

要实现这个最好的方法就是:Object.create,而其他的组合式继承、寄生式继承都会存在很多问题。
首先讲一个最主要的概念:
prototype:指向父对象的共享方法或者属性
特点:实例中访问不到,如要访问就要用proto(本身指向prototype),原型对象中可以访问
组合式继承:通过call来向父对象传递参数
寄生式继承:封装了继承过程

猜你喜欢

转载自blog.csdn.net/Donspeng/article/details/77254652