一道关于原型的问题

var fun = function(){}

fun.prototype = {    
    name : 'peter',    
    age : 25    
}

var a = new fun();
var b = new fun();
console.log(a.name, b.name);//peter peter
fun.prototype.name = 'jack';
console.log(a.name, b.name);//jack jack
fun.prototype = {};
fun.prototype.name = 'tom';
console.log(a.name, b.name);//jack jack
b.constructor.prototype.name = 'kitty';
console.log(a.name, b.name);//jack jack
//输出些什么鬼?

fun.prototype = {};
fun.prototype.name = 'tom';

操作之后的输出很不理解,fun的prototype已经改变了,访问a的name属性,查找原型链不应该输出tom?
更新:
还有一个问题,由于fun.prototype = {}操作覆盖了原型,所以之后对fun.prototype的属性修改其实修改的是{}.于是把fun.prototype = {}操作去掉,代码如下:

var fun = function(){}

fun.prototype = {    
    name : 'peter',    
    age : 25    
}

var a = new fun();
var b = new fun();
console.log(a.name, b.name);//peter peter
fun.prototype.name = 'jack';
console.log(a.name, b.name);//jack jack
fun.prototype.name = 'tom';
console.log(a.name, b.name);//tom tom
b.constructor.prototype.name = 'kitty';
console.log(a.name, b.name);//tom tom
//输出些什么鬼?

b.constructor.prototype.name = 'kitty'这一步问什么没有生效呢

阅读 3.5k
评论
    7 个回答
    • 1.1k

    你要知道一点,Object的赋值,其实都是引用。就懂了。

    你可以试一下给出现过的object命名。

    fun.prototype = {    
        name : 'peter',    
        age : 25    
    } //A

    所以a和b的 proto 指向 A

    fun.prototype.name = 'jack';
    此时fun.prototype也指向A,所以是A的name被修改了。

    fun.prototype = {};//B
    此时fun.prototype指向B

    然而a,b依然指向A。

    这里体现的其实是Object的引用性质

      相似问题
      推荐文章