# 原型链题目 ## 1 、prototype和__proto__的概念(简答题) prototype是函数的一个属性(每个函数都有一个prototype属性),这个属性是一个指针,指向一个对象。它是显示修改对象的原型的属性。 __proto__是一个对象拥有的内置属性,是JS内部使用寻找原型链的属性。 ## 2、prototype和__proto__的区别? prototype是函数的内置属性,__proto__是对象的内置属性 ## 3、js中的原型链以及最顶端是什么?(填空题) Object.prototype ## 4、以下代码会输出什么?()()()()()(填空题) ``` function Foo() { getName = function() { alert(1) }; return this; } Foo.getName = function() { alert(2) }; Foo.prototype.getName = function() { alert(3) }; var getName = function() { alert(4) }; function getName() { alert(5) }; Foo.getName(); //2 getName(); //4 Foo().getName() // 1 getName(); //1 new Foo.getName(); //2 ``` 答案:2 4 1 1 2 注释: getname() 在调用的时候 ,前面声明了两个getname函数 一个是function通过函数声明 另一个是通过 var 也就是函数表达式声明函数 根据预编译的过程 ,函数表达式和函数声明都会发生变量提升 var getname=function(){alert(4)} function getname(){alert(5)} 过程: var getname; funciton getname(){alert(5)} getname=function(){alert(4)} ## 5、以下代码会输出什么?()(填空题) ``` function A() { this.do = function() { return 'foo' } } A.prototype = function() { this.do = function() { return 'bar' } } var x = new A().do() console.log(x) ``` 答案:foo ## 6、以下代码会输出什么?()(填空题) ``` function C1(name) { if (name) { this.name = name; } } function C2(name) { this.name = name; } function C3(name) { this.name = name || 'join'; } C1.prototype.name = 'Tom'; C2.prototype.name = 'Tom'; C3.prototype.name = 'Tom'; console.log((new C1().name)+'/' + (new C2().name)+'/' + (new C3().name)); ``` 答案:Tom/undefined/join new c1().name 已知 c1中没有name属性(实例化的时候没传参数) 所以在访问name属性的时候 会访问c1原型中的name属性 即后面赋值原型的语句 C1.prototype.name = 'Tom'; c2在访问name属性的时候 会先从c2内部找 已知 c2内部已经有 this.name=name了 虽然在实例化的时候没有传入参数作为name的值 但是this.name赋值的步骤没有经过任何条件判断 所以会赋值为 undefined new c3().name c3.name会先从c3的实例对象找 已知 c3的实例对象中this.name也是没有任何条件判断必然会执行 他的值是如果name有值就是传入的name的值 如果没有传入参数name的值 就是join 实例化的时候没有传参数 所以是join ## 7、以下代码会输出什么?()()()(填空题) ``` 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); console.log(new B().a); console.log(new C(2).a); ``` 答案:1 undefined 2 分析:首先看当前构造函数是否定义这个属性,若有直接输出,否则在其原型链上依次查找。 A:原型链查找到 a=1;B:函数本身有 a属性;C:函数先判断参数;若参数的布尔值为真则输出 a的值,否则输出原型链上a的值 ## 8、以下代码会输出什么?()()()()(填空题) ``` var F = function() {}; Object.prototype.a = function() { console.log("a()"); }; Function.prototype.b = function() { console.log("b()"); }; var f = new F(); F.a(); F.b(); f.a(); f.b(); ``` 答案:a() b() a() 报错 分析: 函数内部和函数原型上没有 a,沿着其原型链查找属性。 f.b(),f 的构造函数是 F 而非 Function ,从上述原型链图观察,f 的原型链查找不到 Function的原型。 F.a() 因为F是 函数 继承自 Function Function又继承自 Object 所以a属性不在F中时会按顺序查找到object.prototype.a的结果为 a() F.b同理 f.a() 因为f是通过F函数构造出的对象 所以 他属于object 能访问object.prototype 但是不属于 function 所以不能访问 function.prototype 所以 f.b()报错 ## 9、以下代码会输出什么?()()()()(填空题) ``` var A=function(){} A.prototype.n=1 var b=new A() A.prototype={ n:2, m:3 } var c=new A() console.log(b.n,b.m,c.n,c.m) ``` 答案:1 undefined 2 3 ## 10、f有方法a吗?有方法b吗?()()(填空题) ``` var F = function () {} Object.prototype.a = function () {} Function.prototype.b = function () {} var f = new F() ``` 答案:有a 没有b ## 11、以下代码会输出什么?()()()()(填空题) ``` function Person(){} Person.prototype.n=1 var p1=new Person() Person.prototype={ n:2, m:3 } var p2=new Person() console.log(p1.n,p1.m,p2.n,p2.m) ``` 答案:1 undefined 2 3