函数的原型属性

时间:2013-12-11 16:01:26

标签: javascript function inheritance prototype

我正试图解决这个问题:

a = new Foo(name); // a is function
a(); // returns a result
a.set(); // returns another result

我已经像上面那样实现了:

function Foo (name) = {
  val = name;
  ret = function () { return val; }
  ret.set = function (v) { return val = v; }
  return ret;
}

然后,对于Foo的多个实例,我不想创建方法'set',而是通过prototype属性共享它。但是,我所做的所有实验都没有效果。它仅适用于对象,而不适用于函数。即使是下面的代码也不起作用:

foo = function () { return 'a'; }
foo.foo = function ()  { return 'foo'; }
foo.prototype.bar = function ()  { return 'bar'; }

foo(); // a
foo.foo(); // foo
foo.bar(); // Uncaught TypeError: Object function () { return 'a'; } has no method 'bar' 

3 个答案:

答案 0 :(得分:1)

遗憾的是,无法通过原型链仅向某些功能添加属性。函数在其原型链中有一个对象,即Function.prototype。无法创建具有其他[[Prototype]] s。

的函数

最接近你想要的是这两个例子:

您的解决方案

function Foo (name) = {
  val = name;
  ret = function () { return val; }
  ret.set = function (v) { return val = v; }
  return ret;
}

更改Function.prototype

Function.prototype.set = function (v) { return this.val = v; };
function Foo (name){
  ret = function () { return this.val; }
  ret.val = name;
  return ret;
}

var f = new Foo('myfunc');
f.set('myval');
console.log(f.val);

我强烈推荐第一个解决方案,因为在第二个解决方案中,每个函数都共享set属性/方法。更改预定义的原型通常是不受欢迎的,除非它是从该语言的新版本移植功能。

答案 1 :(得分:0)

在上一个示例foo中,具有函数bar,只有它的原型才有。

因此,只有foo个对象具有函数bar


所以你可以这样做:

foo = function () { return 'a'; }
foo.foo = function ()  { return 'foo'; }
foo.prototype.bar = function ()  { return 'bar'; }

var f = new foo(); // [object]
f.foo(); // TypeError: Object [object Object] has no method 'foo'
f.bar(); // bar

答案 2 :(得分:0)

试试这个:

foo = function (name){
      this.name = name;
    }
foo.prototype.set = function(name){ return this.name = name; }

var f = new foo('yourName');
alert(f.name);
f.set('yourNameEdited');
alert(f.name);

这是DEMO

相关问题