JavaScript中原型和原型链详解(5)

var Jobs = new Person("Jobs");
    Jobs.company = "Apple";//设置自己的company属性,掩盖了原型的company属性
    Jobs.SayHello = function()
    {
        alert("Hi,"+this.name + " like " + this.company);
    };
    Jobs.SayHello();//自己覆盖的属性和方法,输出"Hi,Jobs like Apple"
    BillGates.SayHello();//Jobs的覆盖没有影响原型,BillGates还是照样输出
</script>

看下面一个原型链例子:

复制代码 代码如下:


<script type="text/javascript">
    function Year(){
        this.value = 21;
    }
    Year.prototype = {
        method:function(){

}
    };

function Hi(){

};
    //设置Hi的prototype属性为Year的实例对象
    Hi.prototype = new Year();
    Hi.prototype.year = 'Hello World';

Hi.prototype.constructor = Hi;

var test = new Hi();//创建一个Hi的新实例

//原型链
    test [Hi的实例]
        Hi.prototype [Year的实例]
            {year:'Hello World'}
            Year.prototype
                {method:……};
                object.prototype
                    {toString:...};

</script>

从上面例子中,test对象从Hi.prototype和Year.prototype中继承下来;因此他能访问Year的原型方法method,同时他能访问实例属性value

__ptoto__属性

__ptoto__属性(IE浏览器不支持)是实例指向原型对象的一个指针,它的作用就是指向构造函数的原型属性constructor,通过这两个属性,就可以访问原型里的属性和方法了。

Javascript中的对象实例本质上是由一系列的属性组成的,在这些属性中,有一个内部的不可见的特殊属性——__proto__,该属性的值指向该对象实例的原型,一个对象实例只拥有一个唯一的原型。

复制代码 代码如下:


<script type="text/javascript">
    function Box(){        //大写,代表构造函数
        Box.prototype.name = "trigkit4";//原型属性
        Box.prototype.age = "21";
        Box.prototype.run = function()//原型方法
        { 
            return this.name + this.age + 'studying';
        }
    }

var box1 = new Box();
    var box2 = new Box();
    alert(box1.constructor);//构造属性,可以获取构造函数本身,
                            //作用是被原型指针定位,然后得到构造函数本身
</script>  

__proto__属性和prototype属性的区别

prototype是function对象中专有的属性。
__proto__是普通对象的隐式属性,在new的时候,会指向prototype所指的对象;
__ptoto__实际上是某个实体对象的属性,而prototype则是属于构造函数的属性。__ptoto__只能在学习或调试的环境下使用。

原型模式的执行流程

1.先查找构造函数实例里的属性或方法,如果有,就立即返回。
2.如果构造函数的实例没有,就去它的原型对象里找,如果有,就立即返回

原型对象的

复制代码 代码如下:


<script type="text/javascript">
    function Box(){        //大写,代表构造函数
        Box.prototype.name = "trigkit4";//原型属性
        Box.prototype.age = "21";
        Box.prototype.run = function()//原型方法
        { 
            return this.name + this.age + 'studying';
        }
    }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wgffpp.html