Javascript:访问原型的公共方法不起作用

时间:2011-11-16 11:52:48

标签: javascript public prototype-programming

我想在Javascript中创建一个只有一个公共函数的简单类,如下所示:

function A(myTitle) { 
    var title = "";
    this.getTitle = function() {
        return title;
    };
    title = myTitle;
};

var anInstance = new A("first");
console.log("anInstance.getTitle(): '"+anInstance.getTitle()+"'"); 
// expecting to return "first"

这确实按预期工作。

现在我想将这个类作为原型添加到一个新类中,其中包含一个新的标题变量,以便getTitle()方法返回变量的值:

var myA = new Object();
myA.title ="second";
myA.prototype = anInstance;
console.log("myA.getTitle(): '"+myA.getTitle()+"'"); 
// expecting to return "second"

但不是预期的“秒”,而是导致以下错误:

TypeError: 'undefined' is not a function (evaluating 'myA.getTitle()')

此功能访问有什么问题?

更新 我的问题的关键点如下:在我的应用程序中,我将创建几千个“A”类型的实例和几个其他类似类型的实例。因此,内存效率和性能很重要。所以我认为创建相应的方法(后面会有几个,getTitle只是一个例子)只有一次并且“数据对象”引用这些方法会很棒。这可能吗?

2 个答案:

答案 0 :(得分:2)

如果您只想要实例变量(这就是我看到您使用的全部内容),那么惯用JavaScript有什么问题:

function A(title) { 
    this.title = title;
};

A.prototype.getTitle = function() {
    return this.title;
};

var anInstance = new A("first");
var myA = new A("second");

你可以在JavaScript之上实现类似Self的原型OO和类似Smalltalk的类OO,但这只适用于继承层次结构,其中JS的扁平模型(有利于组合而不是继承 - 它是很容易为原型或apply()任意构造函数添加新方法,但是你必须跳过一些箍来使继承正常工作)是不够的。

至于为什么你的代码不能工作:你的getTitle()方法返回一个词法而不是一个实例变量,它不会通过原型链来解析属性,因此不能被你的方式覆盖;另外,.prototype是构造函数的一个属性,用于初始化新创建的实例的内部 [[Prototype]] 属性 - 在一般对象上设置.prototype无效关于财产解决的任何内容。

答案 1 :(得分:0)

首先,JavaScript不是基于类的语言。

这也很有效,并且我不确定您尝试使用您的解决方案实现的目标:

http://jsfiddle.net/jRtD2/