`
DBear
  • 浏览: 231782 次
  • 性别: Icon_minigender_2
  • 来自: 上海
社区版块
存档分类

JS类中能模拟出依赖对象本身的可变的私有属性吗?

 
阅读更多

JS是轻量级语言,在类的概念上没有如Java那样严格意义上私有函数,公有函数,私有属性,公有属性。但是我们考虑到复用,仍然会希望能够模拟出这些特性。有关私有函数、公有函数的方法,其实蛮简单,就是把私有函数以变量的形式,扔到prototype的闭包中;公有函数则以返回的形式暴露在外面。

 

 

function People() {

};

People.prototype = (function(){
	var _private = function(){};

	var public = function(name){
              _private.call(this);
	};

	return {
               public : public 
	};
})();

 

 

大神说,这个严格来说不是私有函数,因为不搞私有属性没有依赖,但是这种把一个函数自己依赖的其它函数放在闭包里是个很好的习惯。

 

写出来了“私有函数”和公有函数,那么私有属性可否创建呢,比如如下需求的

 

 

var person = new People('xxx');

person.name; // undefined

person.getName(); // 'xxx';

 

我刚开始试图这样写

 

function People(name) {
       this.setName(name);
};

People.prototype = (function(){
        var _name;
        var getName = function(){
	      return _name;
        };

	var setName = function(name){
             _name = name;
	};

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

 

我创建一个实例

 

var me = new People('xxx');

console.log(me.name);
console.log(me.getName());

 

结果却是符合了要求。但是,我再创建一个实例

 

var me = new People({name:'L'});
var you = new People({name:'J'});
console.log(me.name);
console.log(me.getName());
console.log(you.name);
console.log(you.getName());

 

然后你会发现,打印出来的都是 'undefined' 'J'。也就是说,原型的_name被最后一个创建的实例改掉了,原因嘛,就是因为_name在原型里,是所有实例共用的。。。

 

因此在JS的类中模拟私有属性是不成立的。忍受下洁癖,还是开放出来吧。

 


分享到:
评论

相关推荐

    可变电阻器外形和电路符号简介

    可变电阻器的外形与普通电阻器在外形上有很大的区别,它具有下列一些特征,根据这些特征可以在线路板中识别可变电阻器:(1)可变电阻器的体积比一般电阻器的体积大些,同时电路中可变电阻器较少,在线路板中能方便...

    java 面试宝典

    其他类可以是任意访问级别的类,如默认访问级别(package-private)、私有类(private)等。 **2. Java有没有goto?** Java语言最初设计时包含了`goto`关键字,但在最终版本中将其移除,因此标准Java中并没有`goto`...

    Moq的自动模拟IoC容器_C#_下载.zip

    在.NET开发领域,Moq和...它结合了Moq的模拟功能和IoC容器的依赖管理,使得在单元测试中能更好地控制和隔离依赖,确保测试的准确性和代码的可维护性。通过理解和运用这种技术,开发者可以编写出更加健壮和可靠的软件。

    Java面试宝典

    - **Inner Class**:非静态内部类,它依赖于外部类的实例,可以访问外部类的私有成员。 **27. 内部类可以引用它的包含类的成员吗?有没有什么限制?** 内部类可以引用其包含类的成员,包括私有成员。但是,内部类...

    java面试大全

    - 如果是引用类型,`final`修饰的是引用不可变,即不能指向另一个对象,但对象本身的状态可以改变。 **11. "=="和equals方法究竟有什么区别?** - `==`比较的是两个对象的引用地址。 - `equals()`方法比较的是两个...

    JavaScript门道之标准库

    - Number对象的属性:例如Number.MAX_VALUE是Number对象的一个属性,它代表了JavaScript中能表示的最大正数。 - Number对象的方法:虽然Number对象不能直接获取它的属性,但可以通过Number原型对象上定义的方法来...

    Java程序员面试宝典2012最新出炉

    - 当使用`final`关键字修饰一个对象引用时,意味着该引用不能指向另一个对象,但指向的对象的内容是可以改变的(除非对象本身也是不可变的)。 11. **"=="和equals方法究竟有什么区别?** - `==`操作符用于比较两...

    管理系统能否在vc中能运行

    标题中的“管理系统能否在VC中能运行”这个问题,实际上是在探讨一个基于Visual C++(简称VC)开发的管理系统是否可以在Turbo C(简称TC)环境下正常执行。这涉及到编译器兼容性、代码标准和库依赖等多个方面。 ...

    Java面试宝典2018

    `String`对象是不可变的,每次拼接都会创建新的`String`对象。 #### 32. 是否可以继承String类? 不可以。`String`类是最终类(final),不能被继承。 #### 33. Strings=newString("xyz");创建了几个String Object...

    java面试宝典

    - 如果是引用类型,那么是引用不可变,但对象本身可以改变。 **11. "==" 和 equals 方法究竟有什么区别?** - `==`:用于比较两个变量的内存地址是否相等。 - `equals`:用于比较两个对象的内容是否相等,需注意...

    面试题经典

    其他非公共类(如私有类(private)或默认访问级别的类)可以在同一个文件中定义。 #### 2. Java有没有goto? Java中没有传统的`goto`语句,但它有一个类似的功能叫做`break`和`continue`。`break`用于退出循环或`...

    Java面试宝典2013_PDF版.pdf

    修饰对象引用时,引用变量不可指向其他对象,但是对象本身的内容是可以修改的。 11. "=="和equals方法究竟有什么区别? "=="比较的是两个变量的引用是否相同,即它们是否指向内存中的同一个位置;equals方法默认...

    C++模拟题5答案.docx

    解析:(P87)const关键字在C++中有多重用途:它可以用来声明常量,修饰指针,表示指针本身是可变的,但所指对象不可变;也可以修饰成员函数,表示该函数不会修改类的非静态数据成员,这样有助于编译器进行优化,并且...

    Java程序员面试宝典2013版

    - 引用的对象是否可以变取决于该对象是否为不可变类型。 #### 11. "=="和equals方法究竟有什么区别? - `==`比较的是对象的内存地址。 - `equals`方法比较的是对象的内容是否相等,默认行为是比较内存地址,但通常...

    邮件发送依赖包

    例如,使用JavaMail发送邮件的基本步骤包括创建`Session`对象,设置属性,然后创建`MimeMessage`实例并填充邮件内容,最后通过`Transport.send()`方法发送邮件。 另外,现代开发中,人们更倾向于使用依赖管理工具如...

    Java就业面试题264道(独家奉献)

    - `final`修饰的变量其引用不能改变,但引用的对象内容可以改变,除非对象本身也是不可变的。 **12. "=="和equals方法究竟有什么区别?** - `==` 操作符用于比较两个对象的引用是否相等。 - `equals()` 方法用于...

Global site tag (gtag.js) - Google Analytics