gpt4 book ai didi

javascript - JS中声明成员函数

转载 作者:数据小太阳 更新时间:2023-10-29 05:41:23 24 4
gpt4 key购买 nike

我试过两种方式在JS中声明一个成员函数:

function init() {
var name = "Mozilla";
function displayName() {
alert(name);
}
}
a = new init();
a.displayName()

function init() {
var name = "Mozilla";
displayName = function() {
alert(name);
}
}
a = new init();
a.displayName()

第一个方法告诉我 displayName()undefined。我看到它的方式是创建了一个名为 displayNameFunction 类型的变量,因此它应该可以工作。有人愿意解释为什么它不起作用吗?

最佳答案

它不起作用,因为现在 JavaScript 就是这样工作的。仅仅在构造函数中声明一个函数并不会在构造函数创建的对象上设置它,你必须显式地建立对象和函数之间的链接(直接通过将它分配给对象,或者更常见的是间接地通过原型(prototype))。

你这样做的典型方法是通过原型(prototype)继承,尽管你也可以直接将函数分配给单个对象(下面有更多内容——但是你谈到了“成员函数”,而你在 JavaScript 中做这样的事情的典型方法是通过原型(prototype))。

有几种方法可以设置原型(prototype)继承。经典的方法是通过构造函数上的 prototype 属性(它引用一个对象),即使在遗留浏览器中也与广泛的 JavaScript 引擎兼容。该对象成为通过 new FunctionName 创建的实例的原型(prototype)。您向该对象添加属性以在该函数创建的实例之间共享它们。

因此,使用原型(prototype)继承:

function Init(name) {
this.name = name;
}
Init.prototype.displayName = function() {
alert(this.name);
};

var i = new Init("Mozilla");
i.displayName();

上面的注释:

  1. 在 JavaScript 中,压倒性的约定是构造函数以大写字母开头。所以我称它为 Init 而不是 init

  2. 所有函数都自动拥有一个prototype 属性,这是一个空白对象。

  3. 我向该对象添加了一个名为 displayName 的属性,它引用了一个函数。

  4. 我没有对名称进行硬编码,而是将其作为参数传递给 Init

  5. 请注意,我将名称存储在新建实例的属性中;在对 Init 的调用中,该实例可用作 this

  6. 同样,因为 displayName 作为从对象检索函数引用的表达式的一部分被调用,this 调用中的对象displayName,因此 this.name 具有名称。

  7. 为了简化上面的事情,我为 displayName 分配了一个匿名函数。 (属性有名称,函数没有。)我倾向于在实际代码中不这样做。

  8. 通过 new Init 构造的所有实例将通过原型(prototype)共享 displayName 函数的相同副本。

更多探索(在我的博客上):

您可能也对我的 Lineage toolkit 感兴趣,如果您有兴趣在 JavaScript 中构建对象类(和层次结构)。

从 ES5 开始,还有另一个选项:Object.create .这允许您创建对象并直接为它们分配原型(prototype),而无需使用构造函数。但是因为您使用了 new,这意味着您正在使用构造函数,所以我不会对此进行详细介绍。

现在,如果您不想的话,不必使用 JavaScript 的原型(prototype)功能。例如,您可以这样做:

function Init(name) {
var name = name;

this.displayName = function() {
alert(name);
};
}
var i = new Init("Mozilla");
i.displayName();

它没有使用 JavaScript 的原型(prototype)功能,而是在您每次调用 Init 时创建一个新的 displayName 函数并将其直接分配给对象。 (任何合理质量的 JavaScript 引擎都足够智能,可以重用函数的代码,但每个实例都有不同的函数对象)。上面的代码还使 name 属性完全私有(private),因为我们在每次调用时创建的函数都是对局部变量 name闭包。 (更多:Closures are not complicated)

关于javascript - JS中声明成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13700273/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com