关于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讲师

全部回复(4)
高洛峰
我来解释下:
构造函数的实例化对象通过__proto___指向prototype。
第一个例子:
function Person() {}
var friend = new Person();
console.log(friend.__proto__ === Person.prototype) //true

Person.prototype.constructor = Person;
Person.prototype.name = "Nima";
Person.prototype.age = 23;
//这里所做的其实是给friend.__proto__和Person.protopype共同指向的那个对象{}赋值。
//结束之后friend.__proto__===Person.protopype={constructor:Person,name:'Nima',age:23}
console.log(friend.__proto__ === Person.prototype) //依旧是true


第二个例子
function Person() {

}
var friend = new Person();
console.log(friend.__proto__ === Person.prototype) //true
Person.prototype = {
    constructor: Person,
    name: "Nima",
    age: 23
}
//这里做的事,其实是把 Person.prototype指向另一个对象了。而friend.__proto__却依然指向原来的那个空对象{}。
//这里关键是把Person.prototype想象成一个指针,这个指针可以指向任意对象。但指向过后,却和__proto__指向的是不同的对象了。但是实例化对象通过__proto__来寻找原型链上的属性。
console.log(friend.__proto__ === Person.prototype) //flase

看图体会:

迷茫

代码从上至下依次执行,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 属性

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

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