2 yzy4829229 yzy4829229 于 2016.03.10 12:21 提问

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个回答

showbo
showbo   Ds   Rxr 2016.03.10 13:35

第一种相当于oo语言的静态属性,prototype才是类实例属性

qq_19891827
qq_19891827   2016.03.10 12:46

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

qq_19891827
qq_19891827 回复易天曦: 使用Person.prototype.name =""的方式添加的属性会直接添加到该对象的原型中去,而用Person.prototype = { }的方式则是断开了该方法与其原型之间的联系,从新建立一个新的联系作为它的新的原型对象。
接近 2 年之前 回复
qq_19891827
qq_19891827 回复易天曦: 相互学习吧,私信给你
接近 2 年之前 回复
yzy4829229
yzy4829229 能不能加个QQ
接近 2 年之前 回复
yzy4829229
yzy4829229 首先,我纠正我的一个错误,第一段代码应该是Person.prptotype.name.....这个是我没有注意。第二,我想问一下,它默认的prototype属性,我通过Person.prototype.name ="",Person.prototype.age= ,和Person.prototype = { } ,两者在解释器的处理上有什么不同,前者一条条输入的属性难道不是放在一个对象里吗?或者一堆内存中?
接近 2 年之前 回复
qq_19891827
qq_19891827 回复易天曦: 对的,如果觉得有点用,请采纳,谢谢
接近 2 年之前 回复
yzy4829229
yzy4829229 我的失误,应该是Person.prototype.name
接近 2 年之前 回复
qq_19891827
qq_19891827   2016.03.10 12:59

至于点操作符后面,表示是某个对象下的属性或者方法,我理解它就是在对象存储空间下的一个变量,该变量存储了属性内容或者方法体的实际内存的地址的值,通过该地址的值可以找到该属性的具体内容或方法体

yzy4829229
yzy4829229 我也是这么理解的,哈哈
接近 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!