关于javascript:构造函数原型链-prototype

8次阅读

共计 2168 个字符,预计需要花费 6 分钟才能阅读完成。

第一题

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 指针 - 参考

正文完
 0