为什么使用this.__proto__[key]=obj[key]会多出一段下面的输出

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
</head>

<body>

<script type="text/javascript">

function a() {
    console.log("I'am a function.");
}
//b是实例化对象,a是构造函数
var b = new a();
//console.log(b.__proto__)

var $ = function() {
    extend = function(obj)
    {
        console.log(obj)
        console.log('扩展')
        for(var key in obj)
        {
            console.log('key');
            console.log(key);
            
            console.log('obj');
            console.log(obj);
         
            this.__proto__[key]=obj[key];
        }
    }  
    return { extend : extend };  
}();  

$.extend({
    myFunction:function(obj)
    {
        console.log('我函数')  
    }
})

console.log('第二次')

$.extend({
    showScreen:function(obj)
    {
        console.log('展示的大屏幕')  
    }
})


$.showScreen();

$.myFunction();

</script>


</body>
</html>

图片描述

我每次只是增加一个key
第二次增加的key不包括第一次的key
但是第一次的key还是显示出来了

阅读 2.6k
2 个回答

因为你为this.__proto__添加了myFunctionshowScreen两个key啊...在遍历的时候就会输出两个呐...

那我改出来一个大致能满足你的需求的版本,你可以瞧一眼...

<script>
        
function a() {
    console.log("I'am a function.");
}
//b是实例化对象,a是构造函数
var b = new a();
//console.log(b.__proto__)

var $ = function() {
    extend = function(obj)
    {
        console.log(obj)
        console.log('扩展')
        for(var key in obj)
        {
            console.log('key');
            console.log(key);
            
            console.log('obj');
            console.log(obj);
        
            // this.__proto__[key]=obj[key];
        }
    }  
    return { extend : extend };  
}();  

$.extend({
    myFunction:function(obj)
    {
        console.log('我函数')  
    }
})

console.log('第二次')

$.extend({
    showScreen:function(obj)
    {
        console.log('展示的大屏幕')  
    }
})


// $.showScreen;

// $.myFunction;

</script>

给你个例子

var a = {};
var b = {};
a.__proto__.show = function(){
    console.log("show")
}
b.show();//show
for(var key in b){
    console.log(key)//show
}

改良后

var $ = {
    a: "aaaa",
    extend: function (obj) {
        console.log('扩展:', obj)
        for (var key in obj) {
            console.log('key:', key);
            console.log('value:', obj[key]);

            this[key] = obj[key];
        }
    }
}

$.extend({
    myFunction: function () {
        console.log('我函数',"a:", this.a);
        return this;
    }
})
console.log('第二次')
$.extend({
    showScreen: function () {
        console.log('展示的大屏幕')
        this.myFunction();
        return this;
    }
})

$.showScreen().myFunction();
推荐问题