javascript 的原型对象的字面量写法
大家讲道理
大家讲道理 2017-04-11 11:20:59
[JavaScript讨论组]

function Person(){}

/*
    Person.prototype.name = 'tanbin';
    Person.prototype.age = 22;
    Person.prototype.sayName = function(){alert(this.name);}
*/
字面量写法
Person.prototype={
    name: 'tanbin',
    age: 22,
    sayName: function(){
        alert(this.name);
        }
    }

var p1 = new Person();

p1.sayName();  //这里会出错吗?这种字面量的写法不是会产生这样的问题,new Person()时,返回的对象会有一个[[prototype]]指向原型对象,因为上面重写了Person的原型对象,但没有修改到原来的原型对象。所以p1是不会有sayName属性的。
大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

全部回复(4)
伊谢尔伦

单词打错了

黄舟

谁说p1 没sayName属性的 ?即使你重写Person原型,但是sayName仍然还在。sayName已经在原型链上。
重写Person原型后,Person.constructor 就指向Object。而Object下是有sayName属性的。

阿神

这种写法没有错误,不会报错,运行p1.sayName()会alert出“tanbin”,p1这个对象拥有prototype原型对象的所有属性和方法,只是p1.constructor变成了赋值给prototype对象({}字面量对象)的constructor,即function Object() { [native code] }。

PHP中文网

说下我的见解,你每次改写person.prototype的时候其实都相当于将prototype指向一个新的地址,在你写了sayname方法后,以person为原型new出了一个新对象p1,这时候p1会继承person,p1的__proto__会指向person的prototype指向的地址。这个地址里有sayname方法。
然后当你再次重写person.prototype后,person.prototype指向了一个新地址,但这并不会改写p1.__proto__,所以p1中仍然总有sayname方法,但是因为p1.__proto__和person指向的地址不一样,所以p1已经和person没有关系了,这时候p1 instanceof person返回false。
说俗一点,一个父亲有了一个小孩,小孩继承了父亲的肤色,并且和父亲相同的姓,但是过了一会父亲改姓了,小孩不肯改,于是就决裂了,父子俩变成了两家人,但小孩的肤色并不会变。

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

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