TangLMalan 2016-03-10 04:21 采纳率: 0%
浏览 1445

Javascript中通过点操作符定义属性和字面量形式定义的区别

我已经有一种这样的困惑:
第一种:function Person(){};
Person.name = "liang";
Person.age = 22 ;
Person.sayName = function(){alert(this.name)}
alert(Person.prototype.constructor == Person) ; // true

在以上这个代码中,我创建了一个构造函数Person,那么这个函数会自动添加一个属性prototype,这个属性是一个指针,指向一个原型对象。那么我通过.name,.age给可以往原型对象中添加属性,同时,prototype这个对象也会自动添加一个constructor属性,这也是一个指针,指向Person函数。到目前为止。我的理解问题吗?
然后,第二段代码:
var Person = function(){};
Person.prototype = {
name:"liang",
age:23,
sayName:function(){alert(this.name)} };
alert(Person.prototype.constructor == Person); //false

在以上代码中,还是一个构造函数Person,这个Person会自动添加一个属性prototype,这个prototype是一个指针,指向原型对象,那么此时这个Person.prototype指针和第一个那么指针有什么区别吗?为什么我下面这样通过字面量的形式把属性赋予给Person.prototype对象之后,这个对象的constructor属性,这个指针就不再指向Person函数了呢?
还有,这个点操作符经过解释之后,在内存当中是怎么安排点操作符这种行为的?

  • 写回答

3条回答 默认 最新

  • qq_19891827 2016-03-10 04:46
    关注

    首先第一个通过.name,.age添加的属性,并不是添加到了该构造函数的原型中,你可以console.log(Person.prototype);一下,就会发现根本没有添加到原型中去,而是仅仅添加到了该构造函数自身中,称之为自有属性。如果要把属性添加至原型中要这样写,Person.prototype.name='xxxx',添加到原型中的属性称之为共有属性。
    然后有一个概念就是每一个对象(姑且称之为a)都有一个prototype属性指向它的原型对象,该原型对象中默认有个人constructor属性指向a,但是你的第二个代码段,Person.prototype={};你已经抛弃掉了原本该函数的原型对象(constrctor属性指向Person函数),把prototype属性指向了一个新的对象作为新的原型对象,这个新的原型对象的constrctor属性自然不会再指向Person函数了,而是指向Object。

    评论

报告相同问题?

悬赏问题

  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮