我用JavaScript编写的原型有问题,有什么想法吗?

我用JavaScript编写的原型有问题,有什么想法吗?,javascript,inheritance,prototype-oriented,Javascript,Inheritance,Prototype Oriented,下面的代码并不像我想象的那样生成原型。有人能看出我做错了什么吗 var A = function () { return { workingTest: function () {return "OK";} }; }; A.prototype.notWorkingTest = function () {return "Not so much";}; var a = new A(); a.workingTest(); // "OK" a.notWorkingTe

下面的代码并不像我想象的那样生成原型。有人能看出我做错了什么吗

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类的正确方法,但我遗漏了一些东西。

将A更改为

var A = function () {
  this.workingTest = function () {return "OK";};
};
问题是原始的
A
函数正在创建并返回
对象的直接实例
,而不是使用由
新的
操作符创建并绑定到此
A
实例

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

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
返回一个新对象,它返回的值不再是B
实例,并且不使用
B
的原型。

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

相反,您需要将
workingTest
分配给构造函数内的
this
,并且根本不返回任何内容:

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

由于您扩展了
A
的原型,而
新的A()
返回一个“匿名”对象。

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

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规范。

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

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

如果你做
console.log(a.prototype)
,你会得到什么?这就解决了它。先生,你是今天的英雄!