2

下面的代码不会像我想象的那样产生原型。谁能看到我做错了什么?

var A = function () {
    return {
        workingTest: function () {return "OK";}
    };
};

A.prototype.notWorkingTest = function () {return "Not so much";};

var a = new A();

a.workingTest(); // "OK"
a.notWorkingTest(); // TypeError: "undefined_method"

有任何想法吗?我认为这是扩展 JS 类的正确方法,但我遗漏了一些东西。

4

5 回答 5

3

将 A 更改为

var A = function () {
  this.workingTest = function () {return "OK";};
};

问题是您的原始A函数正在创建并返回一个直接实例,Object而不是使用Anew运算符创建并绑定到的实例this

要理解这一点,请尝试运行

var B = function () { return { x: 42 }; }
var C = function () { this.x = 42; }
var b = new B;
var c = new C;
alert("b.constructor === B : " + (b.constructor === B));  // false
alert("b.constructor === Object : " + (b.constructor === Object));  // true
alert("c.constructor === C : " + (c.constructor === C));  // true

所以因为B返回了一个新的对象,所以它返回的值不再是 aninstanceof B并且不使用B' 的原型。

于 2011-07-07T15:52:52.513 回答
0

因为A返回一个单独的对象,a不是A类的实例;相反,它是一个恰好由A函数返回的普通对象。
它没有连接A或根本没有连接prototype

相反,您需要在构造函数内部分配workingTestthis并且根本不返回任何内容:

var A = function () {
    this.workingTest = function () { return "OK"; };
};
于 2011-07-07T15:54:12.693 回答
0

因为您在返回“匿名”对象时扩展A了 的原型。new A()

于 2011-07-07T15:54:29.457 回答
0

在现代浏览器中,您可以通过以下方式保留有趣的原型设计方法:

var A = {
  workingTest: function () {return "OK";}
};
A.notWorkingTest = function () {return "Yes it does";};

var a = Object.create (A);
a.workingTest(); // "OK"
a.notWorkingTest(); // "Yes it does"

a.extending = function () {return "extended";};
var b = Object.create(a);
b.workingTest(); // "OK"
b.extending();  // "extended"

这根据 ES5 规范工作。

于 2011-07-07T15:59:18.807 回答
0

您定义A为一个返回对象字面量的函数。调用函数时使用new关键字暗示它是一种特殊类型的函数,即构造函数。JavaScript 中的构造函数必须以特定方式编写,使用this关键字设置属性。

var A = function () {
  this.workingTest = function () {return "OK";};
};
于 2011-07-07T16:00:05.607 回答