构造函数,原型链, prototype
Posted Hedgehog
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了构造函数,原型链, prototype相关的知识,希望对你有一定的参考价值。
第一题
var fun = function(){
this.name = \'peter\';
return {
name: \'jack\'
};
}
var p = new fun();
//请问p.name是: jack
//每个函数都有返回值,如果使用了return语句,则返回return后跟的值,如果没有使用return,则默认返回undefined.
//特别的,如果这个函数是构造函数,则默认返回this对象,如果构造函数内使用了return语句,并且return后跟的是一个对象,则这个构造函数返回的是这个对象,否则返回this.
第二题
var fun = function(){
this.name = \'peter\';
return \'jack\';
}
var p = new fun();
//请问p.name是: peter
第三题
var fun = function(){}
fun.prototype = {
info : {
name : \'peter\',
age : 25
}
}
var a = new fun();
var b = new fun();
a.info.name = \'jack\';
b.info.name = \'tom\';
//请问a.info.name和b.info.name分别是:tom tom
第四题
var fun = function(){
this.info = {
name : \'peter\',
age : 25
}
}
var a = new fun();
var b = new fun();
a.info.name = \'jack\';
b.info.name = \'tom\';
//请问a.info.name和b.info.name分别是:jack tom
//构造函数的缺点:同一个构造函数的多个实例化之间无法共享属性。
第五题
var fun = function(){}
fun.prototype = {
name : \'peter\',
age : 25
}
var a = new fun();
var b = new fun();
a.name = \'jack\';
b.name = \'tom\';
//请问a.name和b.name分别是: jack tom
//考察this指针指向该函数被调用是的对象,分别是a对象,b对象
//第五题是有区别的,a.name实例本身没有,给当前a这个实例对象执行赋值操作,没有去访问原型上的name。就相当于第三题先访问了原型上的info对象,第五题没有访问过程,只是在实例上添加了name属性值。
第六题
var fun = function(){
this.info = {
name : \'peter\',
age : 25
}
}
fun.prototype = {
info : {
name : \'peter\',
age : 25
}
}
var a = new fun();
var b = new fun();
a.info.name = \'jack\';
b.info.name = \'tom\';
//请问a.info.name和b.info.name分别是:jack tome
//原型模式执行流程:先找构造函数实例的属性或方法,没有再去原型对象找。
解答:
构造函数:javascript 通过构造函数生成新对象,因此构造函数可以视为对象的模板。实例对象的属性和方法,可以定义在构造函数内部。
1,2题考察的是构造函数的返回值的问题。
每个函数都有返回值,如果使用了return
语句,则返回return
后跟的值,如果没有使用return
,则默认返回undefined
.
特别的,如果这个函数是构造函数,则默认返回this
对象,如果构造函数内使用了return
语句,并且return
后跟的是一个对象,则这个构造函数返回的是这个对象,否则返回this
.
所以1题中的p = {name: \'jack\'}
,而2题中的p = {name: \'peter\'}
.
3, 4, 5, 6题都是考察prototype
的知识。prototype
为了弥补构造函数的缺点(同一个构造函数的多个实例之间,无法共享属性,从而造成对系统资源的浪费).
JavaScript 继承机制的设计思想就是,原型对象的所有属性和方法,都能被实例对象共享。也就是说,如果属性和方法定义在原型上,那么所有实例对象就能共享,不仅节省了内存,还体现了实例对象之间的联系。
注意:
第三题 a.info.name这段代码,首先去访问了实例对象本身是否有info这个对象,发现没有就去原型上查找了,发现原型上有,所以地址共享了得到的值都是Tom;
第五题是有区别的,a.name实例本身没有,给当前a这个实例对象执行赋值操作,没有去访问原型上的name。就相当于第三题先访问了原型上的info对象,第五题没有访问过程,只是在实例上添加了name属性值。
为什么第三题是原型查找,第五题是赋值???
第3题和第5题还考察this指针 -参考
以上是关于构造函数,原型链, prototype的主要内容,如果未能解决你的问题,请参考以下文章