2011-07-07 26 views
2

下面的代码并不像我想的那样产生原型。任何人都可以看到我做错了什么?我在JavaScript中做了这个原型的错误,有什么想法?

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

+0

如果你做'console.log(a.prototype)',你会得到什么? –

回答

4

变迁到

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

的问题是,你原来A函数创建并返回的Object直接实例,而不是使用由new运营商和绑定创建thisA实例。

要理解这一点,尝试运行

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

+0

这解决了它。先生,你是当天的英雄! –

0

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

相反,你需要分配给workingTestthis构造函数中,并没有返回任何东西:

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

因为你延长A的原型,而new A()返回一个‘匿名’的对象。

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

0

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

var A = function() { 
    this.workingTest = function() {return "OK";}; 
}; 
相关问题