首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JS: OOP私有函数/私有字段

JS: OOP私有函数/私有字段
EN

Stack Overflow用户
提问于 2013-03-20 04:30:19
回答 3查看 371关注 0票数 2
代码语言:javascript
复制
Systemname =
{

Question :
{
    send: function()
    {
        console.log("send");
    },

    read:   function()
    {
        console.log("read");
    },

    delete: function()
    {
        console.log("delete");
    }
},

Answer :
{
    send: function()
    {
        console.log("Answer sent");
    }
},

Person :
{
    foo: 'foo',
    bar: 'bar',


    add: function(name)
    {
        console.log('person "' + name + '" added');
    },

    remove: function(id)
    {
        console.log('person with id "' + id + '" removed');
    }
}

}

我正在学习oop是如何在js中工作的,我现在对私有方法和字段有点困惑。我希望在person部分有一些私人成员,比如'personCount‘或'lastAddedPerson’。如果我像这样添加它们:

代码语言:javascript
复制
Person:
{
    personCount: 0,
    lastAddedPerson: '',
    ...
}

在person部分的开头,这些字段是公共的,可以用Systemane.Person.Field...我如何才能将它们设置为私有?方法也是如此。

感谢您的帮助。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-03-20 04:33:53

这里有一种方法。

代码语言:javascript
复制
function Person(n) {
   var name = n;
   this.getName = function() {
     return name;
   }
   this.setName = function(newName) {
      name = newName;
   }
}

var person = new Person('roman');
票数 2
EN

Stack Overflow用户

发布于 2013-03-20 04:35:40

在使用文本创建对象时,不能有私有属性或方法。实际上,JavaScript中没有私有属性,但实际上可以通过使用构造函数并将私有属性和方法声明为变量来实现:

代码语言:javascript
复制
function Person() {
    var privteProperty = 1;
    var privateMethod = function(){}

    this.publicProperty = 2;
    this.publicMethod = function(){}
}

然后,您可以使用以下命令创建实例:

代码语言:javascript
复制
var john = new Person();
票数 0
EN

Stack Overflow用户

发布于 2013-03-20 04:40:51

我喜欢使用一种工厂模式而不是new

代码语言:javascript
复制
var Person = (function() {
   return { 
      create: function(name) {
         return (function(n) {
            var name = n;

            function getName() {
               return name;
            }

            function setName(newName) {
               name = newName;
            }

            return {
               getName: getName,
               setName: setName                    
            };
         }(name));
      }
   };   
})();

然后:

代码语言:javascript
复制
var person = Person.create("Bob");
person.getName(); //returns Bob

person.setName("Jimbo");
person.getName(); //returns Jimo

看起来很复杂,但其实很简单。

Person本质上被赋予匿名自调用函数的返回值。此返回值有一个名为create的属性,该属性是对另一个函数的引用,该函数或多或少地充当了一个构造函数。此函数还返回另一个匿名自调用函数的返回值。但是,此返回值是所需对象的实际实例。在这个匿名自调用函数中,您可以看到我有一个名为name的变量。此变量是匿名自调用函数的私有变量,并以词汇方式绑定到定义它的作用域。这意味着name的值被保存在该函数中。基本上,即使在函数执行完成后,它也会挂起。访问或修改该变量的唯一方法是通过getNamesetName函数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15509811

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档