代码片段里的解释都是我自己理解的原型链,如果有人觉得哪里不对可以在评论里直接指出,我们一起讨论哈!
测试题1
function A(){
}
A.prototype.n = 1
var b = new A()
//这一步修改了A.prototype的地址值,改变了A.prototype的指向
A.prototype = {
n:2,
m:3
}
//实例对象c的指向和此时改变后的A.prototype的指向一致
var c = new A()
//实例对象b的指向并没有被改变
console.log(b.n,b.m,c.n,c.m) //1 undefined 2 3
测试题2
var F = function(){}
Object.prototype.a = function(){
console.log('a')
}
Function.prototype.b = function(){
console.log('b')
}
var f = new F();
//f是F的实例对象,所以f.__proto__指向F.prototype,同时Funtion.prototype又是一个空的object对象,所以他的__proto__指向了Object.prototype,Object.prototype是原型链的终点
f.a();//a
f.b();//f.b is not a function
//F是构造函数,所有的函数都是由Function来new的,所以F的__proto__指向了Funtion.prototype,同时Funtion.prototype又是一个空的object对象,所以他的__proto__指向了Object.prototype
F.a();//a
F.b();//b
测试题3
var foo={}
F = function(){};
Object.prototype.a = 'value a'
Function.prototype.b = 'value b'
//foo是一个对象,foo.__proto__指向Object.prototype然后结束,找不到Function.prototype
console.log(foo.a) //value a
console.log(foo.b) // undefined
//F是一个函数,是通过new Funtion()得到的,所以F.__proto指向Function.prototype,同时Funtion.prototype又是一个空的object对象,所以他的__proto__指向了Object.prototype
console.log(F.a) // value a
console.log(F.b) //value b
测试题4
function A(){}
function B(a){
this.a = a;
}
function C(a){
if(a){
this.a = a
}
}
A.prototype.a = 1;
B.prototype.a = 1;
C.prototype.a = 1;
console.log(new A().a) //1
//new B()的时候调用了构造函数,实参没有传相当于只定义了没有赋值,所以a的值为undefined
console.log(new B().a) //undefined
console.log(new C(2).a) //2
测试题5
//123['toString'] 此时 123是一个捅过new Number创造的对象
//所以123.__proto__的指向和Number.prototype的指向一致
//123['toString']相当于查找Number.prototype中的toString属性
//toString中有一个length属性值为1
console.log(123['toString'].length+123) //124