Javascript js中的自调用函数存在问题 var person=函数(){ //私人的 var name=“David”; 返回{ getName:函数(){ 返回名称; }, setName:函数(newName){ name=newName; } }; }(); console.log(person.name);

Javascript js中的自调用函数存在问题 var person=函数(){ //私人的 var name=“David”; 返回{ getName:函数(){ 返回名称; }, setName:函数(newName){ name=newName; } }; }(); console.log(person.name);,javascript,Javascript,问题: 为什么显示:控制台中未定义?您需要使用 <script> var person = function () { // Private var name = "David"; return { getName : function () { return name; }, setName : function (newName) { name = newNam

问题:

为什么显示:控制台中未定义?

您需要使用

<script>
var person = function () {
    // Private
    var name = "David";
    return {
        getName : function () {
            return name;
        },
        setName : function (newName) {
            name = newName;
        }
    };
}();
console.log(person.name);  
</script>
因为
name
是一个闭包变量,不能在匿名函数的作用域之外访问

变量
person
保存从iife返回的值,iife是一个具有属性
getName
setName
的对象,因此这些是您可以从
person
引用访问的唯一属性

演示:

您需要使用

<script>
var person = function () {
    // Private
    var name = "David";
    return {
        getName : function () {
            return name;
        },
        setName : function (newName) {
            name = newName;
        }
    };
}();
console.log(person.name);  
</script>
因为
name
是一个闭包变量,不能在匿名函数的作用域之外访问

变量
person
保存从iife返回的值,iife是一个具有属性
getName
setName
的对象,因此这些是您可以从
person
引用访问的唯一属性


演示:

您正在使用一种模式来模拟私密,您的对象的标题
person
建议使用多个实例,因此我建议不要使用这种模式,因为它完全破坏了JavaScript的基础结构来创建OOP代码(原型)

您可以改为使用构造函数,并用下划线标记privates,如
\u myvar

下面是一些代码,您可以使用它们来理解JS中的原型


您正在使用一种模式来模拟私密,对象的标题
person
建议使用多个实例,因此我建议不要使用这种模式,因为它完全破坏了JavaScript的基础结构来创建OOP代码(原型)

您可以改为使用构造函数,并用下划线标记privates,如
\u myvar

下面是一些代码,您可以使用它们来理解JS中的原型


您必须这样分配名称

person.name=“abc”


现在试试它,它将输出abc。

您必须像这样分配名称

person.name=“abc”


现在试试它,它会输出abc。

试试
console.log(person)
,你就会明白为什么了。你自己写过这个片段吗?如果没有,你在哪里找到的,在它的解释中你不明白什么?有趣的是,甚至代码中的注释都说name属性是私有的,但你不明白为什么你不能记录person name。即使您没有语法错误,并且
console.log(person().name)
name属性将是“private”,因此您无法访问它。这实际上是一种在JavaScript中模拟私有变量的黑客行为,我建议在创建多个实例时不要使用它。如果你想了解更多关于OOP的知识,那么你可以阅读java教程,当你了解类和继承性时,你可以看看mdn中JavaScript是如何实现的(JS中没有类)。@HMR:为什么要阅读java教程?@Bergi在我的文章中,这是最容易在线理解的OOP教程。许多提到继承和OOP的JavaScript教程都提到类,推断您已经知道基于类的OOP。我可以建议他花所有的时间学习if语句while和for each循环,但这样他可能会被将来负责维护代码的人伤害。试试
console.log(person)
,你就会明白为什么了。你自己写过那段代码吗?如果没有,你在哪里找到的,在它的解释中你不明白什么?有趣的是,甚至代码中的注释都说name属性是私有的,但你不明白为什么你不能记录person name。即使您没有语法错误,并且
console.log(person().name)
name属性将是“private”,因此您无法访问它。这实际上是一种在JavaScript中模拟私有变量的黑客行为,我建议在创建多个实例时不要使用它。如果你想了解更多关于OOP的知识,那么你可以阅读java教程,当你了解类和继承性时,你可以看看mdn中JavaScript是如何实现的(JS中没有类)。@HMR:为什么要阅读java教程?@Bergi在我的文章中,这是最容易在线理解的OOP教程。许多提到继承和OOP的JavaScript教程都提到类,推断您已经知道基于类的OOP。我可以建议他花所有的时间学习if语句while和for each循环,但这样他可能会被未来负责维护代码的人所伤害。这种模式非常好,而且是面向对象的。没有理由在这里提出原型遗传。还有,你没有回答这个问题。当然,Bergi,创建数百个实例,每个实例都有自己的函数,对每个实例反复执行相同的操作。也许是时候打开Chrome并查看profiles选项卡了。对象定义的名称
person
建议创建它的多个实例,而此模式不适用于此。当你想实现克隆时,这会给你带来很多麻烦。我们不知道OP使用了什么,我看不到任何指示多个实例的东西(比如构造函数)。即使是这样,模式仍然很好。我每天都会创建百分之一百具有类似功能的实例,只是它们的范围有所不同。问题出在哪里?@Bergi你是对的;我道歉。提供的代码实际上使用了一个匿名函数来创建对象,并建议只有一个人。在一个实际的例子中,person可以用作员工或成员的原型,在这种情况下,上面使用的模式将很难实现。只要让对象的每个实例都有自己的
own
函数,该函数的作用与所有其他实例相同即可