文档分值:3

javascript >>> javascript >>> ES262-3rd

课程目录

ES262-3rd
ES262-4th
ES262-5th
ES262-6th
ES262-7th
再谈原型和原型链

再谈原型和原型链

            function    A(){}
            A.prototype.c    =    2;
            var    a    =    new    A();
            A.prototype.c    =    5;
            alert(a.c)

            function    B(){}
            B.prototype    =    {c:2};
            var    b    =    new    B();
            B.prototype    =    {c:5};
            alert(b.c)

结果是上面为5,下面为2。为什么呢,我仔细思考了一下,发现其实原因很简单。

先来看一个小例子:

img1

img2

为什么a.c = 5,而 b.c = 2?这个很简单吧,不用解释吧。 再来看开始的代码,完全一样的道理。

            $    =    A.prototype
            $.c    =    2
            a.c    =    $.c
            a.c    =    2
            $.c    =    5
            a.c    =    5

            $    =    B.prototype
            $    =    {c:2}
            b.c    =    $.c
            b.c    =    2
            $    =    {c:5}
            b.c    =    2

JS里,对象是以指针的形式进行赋值。

当我们new一个实例的时候,对象的_proto_会指向函数的prototype对象,也就是把prototype的指针赋给proto

当我们修改prototype里的属性,而不是重写prototype,实例对象的_proto_的指针不变,函数的prototype的指针也不变。

变的只是指针指向的那个地址里的东西,所以实例对象的属性会跟着变。

当我们重写prototype里,prototype的指针改变,指向了另一个新的地址。

而实例对象的 _proto_的指针不会改变,依然指向之前的prototype的存放地址。

而我们修改的属性是在新的地址里。所以实例对象的属性不会跟着变。

That's All

[ 该条目创建时间:2016-09-28 20:21:57 ]