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

Posted

技术标签:

【中文标题】Javascript:访问原型的公共方法不起作用【英文标题】:Javascript: Accessing public method of prototype does not work 【发布时间】:2011-12-30 09:00:40 【问题描述】:

我想在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 只是一个示例)并且“数据对象”引用这些方法会很棒。这可能吗?

【问题讨论】:

这里有一个关于类和继承的好例子phrogz.net/js/classes/OOPinJS2.html 【参考方案1】:

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

【讨论】:

请参阅上面关于我的问题背景的更新。 所有方案(惯用的、原型的、基于类的)都可以以某种方式使用,以便共享函数对象;对于您的示例代码,只需将 getTitle() 移出构造函数并使用 this.title 而不是词法...【参考方案2】:

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

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

http://jsfiddle.net/jRtD2/

【讨论】:

您稍微更改了我的代码,但意义重大:您代码中的实例myAA 的新实例。这样,A 的方法就会为它的每个实例复制。我想按照上面的方式来做,这样函数在内存中只存在一次。这可能吗?

以上是关于Javascript:访问原型的公共方法不起作用的主要内容,如果未能解决你的问题,请参考以下文章

元数据库公共链接不起作用。网站无法访问

JavaScript:公共方法和原型

ES6中的class(类)

JavaScript原型链与作用域链

Javascript ADO 记录集打开方法不起作用。参数化查询

从外部 url 访问数据的问题 - jsonp/json 方法不起作用