我用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)
,你会得到什么?这就解决了它。先生,你是今天的英雄!