关于JavaScript中原型的动态性问题
PHP中文网
PHP中文网 2017-04-11 09:49:16
[JavaScript讨论组]

function Person(){

    }
    var friend = new Person();
    Person.prototype.constructor = Person;
    Person.prototype.name = "Nima";
    Person.prototype.age = 23;
    alert(friend.name);

这样写friend.name可以正常显示;

function Person(){

    }
    var friend = new Person();
    Person.prototype = {
        constructor:Person,
        name : "Nima",
        age : 23
    }
    alert(friend.name);

这样写friend.name则是undefined;
原因是Person.prototype.name,这么写相当于在原型对象中加了新的属性,实例的指针指向prototype还是没变的,所以可以显示name。但是Person.prototype = { ... }这么写,相当于是重写了原型对象,那么刚才的实例中的指针就失效了,所以name是undefined。
这样理解没错吧?

但是,
这个例子中:
var obj = {

        name : 'Linken',
        gender :'male',
        age : 23,
        id : 'teacher'
    }
    var a = obj;
    obj = {
        gender :'male',
        age : 23,
        id : 1234
    }
    alert(a.name);

为什么a.name依然可以正常弹出???

PHP中文网
PHP中文网

认证高级PHP讲师

全部回复(3)
迷茫

代码从上至下依次执行,a指向之前的obj,新的obj相当于重新创建了一个对象。

天蓬老师

因为a引用的还是

{
    name : 'Linken',
    gender :'male',
    age : 23,
    id : 'teacher'
}

并不会随着obj变化的
补充一下

但是Person.prototype = { ... }这么写,相当于是重写了原型对象,那么刚才的实例中的指针就失效了,所以name是undefined。

这句话是有问题的,是Person.prototype本该指向的是原型对象,却被更改了

黄舟

我试了你举得例子
不论是 .prototype.name = 的形式 还是 .prototype={name:} 的形式
在new 的对象中均可以访问到 name 属性

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号