<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就像上面三个打印,我有点搞不懂他们的原理
首先你需要看一下原型链prototype;
然后我们来看看你这些问题:
1、为什么在原型上的name可以直接用obj.name打印出lisi而在不在原型上的age用obj.age却打印undefined?
首先你得明白
function
的原型prototype
是object
,在这段代码中:第一个
Person.prototype.name=name;
是在此Person
的原型上定义了这个name
,而原型上的方法属性,所有用Person() new出来的对象所共有的,所以你打印出Person.prototype
是下面这个结果:而
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不能随意定义,你这个定义了,就显得你概念也没搞清楚,我就给你举个例子吧:
你经常会用下面这个方法吧
那么
push
这个方法哪里来的呢?你可以打印一下Array.prototype
:你会发现
push
这个方法在Array.prototype
中定义了,所以你new的数组有push这个方法,所以prototype定义是这个原理。你可以类比一下你的Array
和你定义的Person
,你应该就明白了。