能不能给我讲一讲这三个打印的原理?

<script type="text/javascript">
function Person(name,age,sex){
    Person.prototype.name=name;
    Person.age=age;
    this.sex=sex;
}
var obj=new Person("lisi",18,"male");
console.log(obj.name);  //为什么在原型上的name可以直接用obj.name打印出lisi而在不在原型上的age用obj.age却打印undefined?
console.log(obj.age);//为什么Person.age=age打印是undefined,在this上却可以打印?
console.log(obj.sex);//为什么用this却可以打印出来sex=male,这和在原型上定义Person.prototype.sex=sex;又又什么区别?
</script>

刚学js就像上面三个打印,我有点搞不懂他们的原理

阅读 1.2k
1 个回答

首先你需要看一下原型链prototype;

然后我们来看看你这些问题:

1、为什么在原型上的name可以直接用obj.name打印出lisi而在不在原型上的age用obj.age却打印undefined?

首先你得明白function的原型prototypeobject,在这段代码中:

function Person(name,age,sex){
    Person.prototype.name=name;
    Person.age=age;
    this.sex=sex;
}

第一个Person.prototype.name=name;是在此Person的原型上定义了这个name,而原型上的方法属性,所有用Person() new出来的对象所共有的,所以你打印出Person.prototype是下面这个结果:

Object: {
    name: 'lisi'
}

Person.age=age;这个写法很不规范?如果你需要在new出来的对象里面访问,你只能定义它的原型(prototype)

2、为什么Person.age=age打印是undefined,在this上却可以打印?同理同上。
3、为什么用this却可以打印出来sex=male,这和在原型上定义Person.prototype.sex=sex;又什么区别?

首先,你new出来一个新的对象obj,那么通过你的构造函数可以看出,这个new出来的新对象的属性是有sex的。this指向的当然就是当前对象,这是成立的,这仅是这个对象所有的属性。而name你是定义在Person原型上的,这是所有由Person创造的对象都共有的,这是他们最主要的区别,如果想要了解详细,请点击第一行的mdn链接。


编辑一下,回头发现你的写法很有问题,我也不太能解释的清楚,我们都说原型prototype不能随意定义,你这个定义了,就显得你概念也没搞清楚,我就给你举个例子吧:

你经常会用下面这个方法吧

[1,3,4].push(1);

那么push这个方法哪里来的呢?你可以打印一下Array.prototype:
你会发现push这个方法在Array.prototype中定义了,所以你new的数组有push这个方法,所以prototype定义是这个原理。你可以类比一下你的Array和你定义的Person,你应该就明白了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题