繁体   English   中英

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

[英]Javascript: Accessing public method of prototype does not work

我想在 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"

这确实按预期工作。

现在我想将这个类作为原型添加到一个新类中,该类包含一个新的 title 变量,以便 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还会有更多, getTitle只是一个示例)并且“数据对象”引用这些方法会很棒。 这可能吗?

如果你想要的只是实例变量(这就是我看到你使用的全部),那么惯用的 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对属性解析没有任何影响。

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

这也同样有效,但我不确定您要通过解决方案实现什么目标:

http://jsfiddle.net/jRtD2/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM