gpt4 book ai didi

javascript - 附加到原型(prototype)属性的函数是否没有闭包

转载 作者:行者123 更新时间:2023-11-30 08:57:18 25 4
gpt4 key购买 nike

我想弄清楚如何在创建构造函数后向其添加方法。
在我下面的代码中,我不能使用 Person 的原型(prototype)属性来添加一个可以访问 Person 的变量的新公共(public)方法。 (附加到原型(prototype)属性的函数不要关闭主函数中的变量)。
与第一种方式不同,第二种方式有效 - Person 2。这些似乎被称为特权方法 - http://www.crockford.com/javascript/private.html .

function Person(name, age){}
Person.prototype.details = function(){
return "name: "+name+", age: "+age;
};

function Person2(name, age){
this.details = function(){
return "name: "+name+", age: "+age;};
}

var per1 = new Person("jim", 22);
var per2 = new Person2("jack", 28);

per1.details();
//=> ReferenceError: age is not defined
per2.details();
//=> "name: jack, age: 28"

最佳答案

不,它们对构造函数 vars 没有闭包。它们在不同的范围内。

// This function is in one scope.
function Person(name, age) {
}

// This statement is in the parent scope, which
// doesn't have access to child scopes.
Person.prototype.details = function(){
return "name: "+name+", age: "+age;
};

这就是“公共(public)”函数在 JavaScript 中的工作方式。您可以通过在构造函数中定义 details 使其成为特权函数:

function Person(name, age) {
this.details = function() {
return "name: "+name+", age: "+age;
};
}

当然,这意味着 Person 的每个实例都有它自己的 details 函数副本。

正如@Chuck 所建议的,您还可以将 nameage 设为公共(public)成员,您可以在原型(prototype)函数中访问它们:

function Person(name, age) {
this.name = name;
this.age = age;
}

Person.prototype.details = function(){
return "name: " + this.name + ", age: " + this.age;
};

关于javascript - 附加到原型(prototype)属性的函数是否没有闭包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12375798/

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