js继承与原型链

JavaScript是一种灵活的语言,兼容并包含面向对象风格,函数式 风格等编程风格。面向对象有三大特性和六大原则

原型对象链:

js内建的继承方法被称为原型对象链,又称为原型对象继承。对于一个对象,因为它继承了原型对象的属性,所以它可以访问到这些属性。同理,原型对象也是一个对象,他也有自己的原型对象,因此也可以继承它的原型对象的属性

 ,

这就是原型继承链:对象继承其原型对象,而原型对象继承它的原型对象,以此类推。

对象继承:

使用对象字面量形式创建对象时,会隐式指定 Object.prototype为新对象的[[Prototype]]。使用Object.create()方式创建对象时,可以显式指定新对象的[[Prototype]]。该方法介绍两个参数:第一个为新对象的[[Prototype]],第二个参数描述了新对象的属性,格式如在Object.defineProperties()中使用的一样。

var rectangle = {
    sizeType: '四边形',
    getSize: function() {
        console.log(this.sizeType)
    }
}

var square = Object.create(rectangle, {
    sizeType: { value: '正方形' }
})

rectangle.getSize()   // "四边形"
square.getSize()      // "正方形"

console.log(rectangle.hasOwnProperty('getSize'))
console.log(rectangle.isPrototypeOf(square))
console.log(square.hasOwnProperty('getSize'))
console.log('getSize' in square)
console.log(square.__proto__ === rectangle)
console.log(square.__proto__.__proto__ == Object.prototype)

对象square 继承自对象rectangle,也就继承了rectangle 的sizeType属性和getSize()方法,有通过重写sizeType属性定义了一个自有属性,隐藏并替代了原型对象中的同名属性。所有rectangle.getSize()输出 四边形 而square.getSize()输出 正方形

在访问一个对象的时候,JavaScript引擎汇之星一个受伤过程,如果在对象实例上发现该属性,该属性就会被使用,如果没有发现则搜索其原型对象[[Prototype]],如果仍然没有发信啊,则继续搜索该原型对象上的原型对象[[Prototype]] 直到继承链顶端,顶端通常是一个Object.orototype 其[[Prototype]] 为null  。这就是原型链的查找

原文地址:https://www.cnblogs.com/webcyh/p/11313617.html