var F=function(){}; Object.prototype.a=function(){}; Function.prototype .b=function(){}; var f=new F();
关于这段代码的描述,正确的是:
(注:从网上找到了一个很详细的答案)
网上有一道美团外卖的面试题是这样的: Function.prototype.a = 'a';
Object.prototype.b = 'b';
function Person(){};
var p = new Person();
console.log('p.a: '+ p.a); // p.a: undefined
console.log('p.b: '+ p.b); // p.b: b 问为什么?
有不少同学第一眼看上去就觉得很疑惑,p不是应该继承了Function原型里面的属性吗,为什么p.a返回值是undefined呢?
其实,只要仔细想一想就很容易明白了,Person函数才是Function对象的一个实例,所以通过Person.a可以访问到Function
原型里面的属性,但是new Person()返回来的是一个对象,它是Object的一个实例,是没有继承Function的,所以无法访问
Function原型里面的属性。但是,由于在js里面所有对象都是Object的实例,所以,Person函数可以访问到Object原型里面的
属性,Person.b => 'b'
var F=function(){};
var f=new F();
F.__proto__ ==== Function.prototype;//true
f.__proto__ ==== F.prototype;//true
F.prototype.__proto__ === Object.prototype;//true
f继承的是F的prototype,所以说通过Function.prototype定义的属性相当于定义在F.proto上,可F.proto 与 F.prototype其实没什么关系。所以说f访问不到b,
function Person(){} var friend = new Person(); Person.prototype = { constructor : Person, name : "kayorl", sayName : function () {console.log(this.name);} } friend.sayName(); //ERROR
var obj = {};obj.__proto__ = F.prototype;F.call(obj);return obj
f 能取到a,但取不到b
F 能取到a,b
f.__proto__ === F.prototype
f instanceof Object // true ;f instanceof Function //false ;
F.prototype.__proto__==Object.prototype
f.__proto__.constructor===F.prototype.constructor //都是function类型的匿名函数 (){}F.prototype.constructor === F; //在prototype中的constructor的定义
f.constructor === F //这里的f.constructor应该是原型中的
F.__proto__ === Function.prototype
Function.prototype.isPrototypeOf(F) //trueObject.prototype.isPrototypeOf(F) //true
F.__proto__===Object.prototype //falseF.__proto__ === Function.prototype //true
F.__proto__.__proto__===Object.prototype //true
(注:从网上找到了一个很详细的答案)
网上有一道美团外卖的面试题是这样的: Function.prototype.a = 'a';
Object.prototype.b = 'b';
function Person(){};
var p = new Person();
console.log('p.a: '+ p.a); // p.a: undefined
console.log('p.b: '+ p.b); // p.b: b 问为什么?
有不少同学第一眼看上去就觉得很疑惑,p不是应该继承了Function原型里面的属性吗,为什么p.a返回值是undefined呢?
其实,只要仔细想一想就很容易明白了,Person函数才是Function对象的一个实例,所以通过Person.a可以访问到Function
原型里面的属性,但是new Person()返回来的是一个对象,它是Object的一个实例,是没有继承Function的,所以无法访问
Function原型里面的属性。但是,由于在js里面所有对象都是Object的实例,所以,Person函数可以访问到Object原型里面的
属性,Person.b => 'b'