JS继承中的本地属性与继承属性

本地属性与继承属性

对象通过隐式Prototype链能够实现属性和方法的继承,但prototype也是一个普通对象,就是说它是一个普通的实例化的对象,而不是纯粹抽象的数据结构描述。所以就有了这个本地属性与继承属性的问题。
首先看一下设置对象属性时的处理过程。JS定义了一组attribute,用来描述对象的属性property,以表明属性property是否可以在JavaScript代码中设值、被for in枚举等。
obj.propName=value的赋值语句处理步骤如下:
1. 如果propName的attribute设置为不能设值,则返回
2. 如果obj.propName不存在,则为obj创建一个属性,名称为propName
3. 将obj.propName的值设为value
可以看到,设值过程并不会考虑Prototype链,道理很明显,obj的内部[[Prototype]]是一个实例化的对象,它不仅仅向obj共享属性,还可能向其它对象共享属性,修改它可能影响其它对象。

我们来看一个示例:

    function Person(name){
            this.name = name;   
    }
   
    Person.prototype = {
            type : 'human'   
    };
   
    var p = new Person("xx");
    alert(p.hasOwnProperty('type'));//false
    p.type = 'ren';
    alert(p.hasOwnProperty('type'));//true

结果很明确,对象的属性无法修改其原型中的同名属性,而只会自身创建一个同名属性并为其赋值。

 

你可能感兴趣的:(JavaScript,数据结构,function,prototype)