为什么函数对象的实例没有继承函数原型属性?

时间:2015-03-12 18:04:34

标签: javascript

我有这段代码,我想知道为什么boy.new2未定义?

Object.prototype.new1 = 'h1';
Function.prototype.new2 = 'h2';
function person(){

} 
var boy = new person();
console.log(boy.new1); //h1
console.log(boy.new2); //undefined

3 个答案:

答案 0 :(得分:4)

由于boy不是Function个实例,因此它不会从Function.prototype继承:

boy instanceof Function; // false

原型链是:

  • boy继承自person.prototype
  • person.prototype继承自Object.prototype
  • Object.prototype继承自null

如果您希望person个实例从Function.prototype继承,则可以执行

person.prototype = Object.create(Function.prototype);
person.prototype.constructor = person; /* optional */

Object.prototype.new1 = 'h1';
Function.prototype.new2 = 'h2';
function person(){} 
person.prototype = Object.create(Function.prototype);
person.prototype.constructor = person; /* optional */
var boy = new person();
document.body.innerHTML =
  boy.new1   // "h1"
  + '<br />'
  + boy.new2 // "h2"
;

现在的典型链是:

  • boy继承自person.prototype
  • person.prototype继承自Function.prototype
  • Function.prototype继承自Object.prototype
  • Object.prototype继承自null

答案 1 :(得分:2)

因为函数调用的结果不是函数,所以它是一个对象。

(function() {}).new2会在您引用函数而不是结果对象时产生预期结果。

Function.prototype.logger = console.log.bind(console);

(function foo() {}).logger('hello world'); // logs 'hello world'

编辑:是的,我意识到输出没有显示记录:P oops。你必须打开你的控制台才能看到这项工作。

答案 2 :(得分:0)

试试这个:

console.log(typeof boy);

boy var是一个Object,而不是一个Function