首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >带有私有变量的JavaScript构造器模式

带有私有变量的JavaScript构造器模式
EN

Stack Overflow用户
提问于 2014-09-16 10:15:57
回答 2查看 1K关注 0票数 0

我知道在JS中模拟私有变量是可能的:

代码语言:javascript
运行
AI代码解释
复制
function ConstructorPattern() {
  var privateVar = 'hi there';

  this.getVar = function() {
    return privateVar;
  };
};

但是根据学习JavaScript设计模式的说法,当引用一些类似的代码时,类Car和方法toString

上面是构造函数模式的一个简单版本,但它确实遇到了一些问题。一个是它使继承变得困难,另一个是为使用Car构造函数创建的每个新对象重新定义诸如toString()之类的函数。这并不是最优的,因为理想情况下,这个函数应该在Car类型的所有实例之间共享。

因此,在我的例子中给出的解决方案是通过原型添加getVar函数:

代码语言:javascript
运行
AI代码解释
复制
ConstructorPattern.prototype.getVar = function() {
  return privateVar;
};

当然,这个函数不知道privateVar是什么,所以它不能工作。我知道模块模式,但我特别希望能够实例化多个实例。

是否有任何方法在获得“私有”功能的同时“正确”地使用原型构造器模式?

编辑:--如果没有方法来实现这一点,那么对每个类实例重新定义方法真的很糟糕吗?我最近开始研究采用这种方法的代码库。似乎我唯一错过的就是遗产?

EDIT2:基于可接受答案的链接,将标记为副本。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-16 11:20:28

是否有任何方法在获得“私有”功能的同时“正确”地使用原型构造器模式?

不是的。这种具有特权函数的模式基于闭包作用域,不能使用共享函数。所有特权方法必须是特定于实例的。

如果没有一种方法来实现这一点,那么对每个类实例重新定义方法真的很糟糕吗?

不是的。现代JavaScript引擎很好地优化了这种模式。当然,有小小的头顶,但在典型的设置中您不会注意到。

似乎我唯一错过的就是遗产?

继承仍然是可能的,请参见在JAVASCRIPT模块模式中定义私有字段成员和继承。当然,派生子类不能直接访问父构造函数中声明的私有变量,但通常它们不需要这样做。

票数 3
EN

Stack Overflow用户

发布于 2014-09-16 11:05:41

当您在对象的原型上创建getVar时,当您执行以下操作时,不会调用它:

代码语言:javascript
运行
AI代码解释
复制
objectName.getVar();

因为原型的方法是在对象方法之后。下面的一个例子将向你展示我的意思:

代码语言:javascript
运行
AI代码解释
复制
function Car() {
  var privy = "hidden";

  this.getPrivy = function() {
    return privy; 
  }
}

Car.prototype = {};
Car.prototype.getPrivy = function() {
  return 'i came from prototype'; 
}

var obj = new Car;
obj.getPrivy();

JS遵循一个调用链,如:对象方法、->原型方法、->原型方法等。一路回到Object.prototype。当找到有效的方法时,它将停止并返回。在您的例子中,您的实例的方法比原型的方法更早。

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

https://stackoverflow.com/questions/25875793

复制
相关文章
【Javascript设计模式】Constructor(构造器)模式
前端修罗场
2023/10/07
2410
JavaScript设计模式(1)——Constructor(构造器)模式
在面向对象中,Constructor是一种在内存已经分配给该对象的情况下,用于初始化新创建对象的特殊方法。在JavaScript中,通常用object构造器。
悠扬前奏
2019/05/28
7050
javaScript 递归 闭包 私有变量
递归   递归的概念     在程序中函数直接或者间接调用自己。      跳出结构,有了跳出才有结果。    递归的思想      递归的调用,最终还是要转换为自己这个函数。    应用    function sum(n){   if(n ==1) return 1;   return sum(n-1) + n   }   sum(100)   var fib = function (n){   if(n <=2){   return 1;   }
用户1197315
2019/12/11
5530
Javascript作用域问题的构造函数的变量
构造函数new对于使用。代表创建对象。此外,它可以被用作普通的函数调用,因为它也是一个功能。
全栈程序员站长
2022/07/06
9680
Builder 构造器模式[通俗易懂]
在软件系统中,有时候面临着”一个复杂对象“的创建过程,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将他们组合在一起的算法却通常相对稳定。
全栈程序员站长
2022/09/22
8860
Builder 构造器模式[通俗易懂]
私有变量
构造函数的私有变量,属性和方法都是独立的。 1 window.onload = function() { 2 var person = new Person("Li"); 3 alert(person.getName()); // Li 4 person.setName("Joe"); 5 alert(person.getName()); // Joe 6 7 var person2 = new Person("Ji");
就只是小茗
2018/12/12
6250
设计模式(3)[JS版]-JavaScript中的构造函数模式是什么?
构造函数用于创建特定类型的对象一不仅声明了使用的对象,构造函数还可以接受参数以便第一次创建对象的时候设置对象的成员值。你可以自定义自己的构造函数,然后在里面声明自定义类型对象的属性或方法。在JavaScript里,构造函数通常是认为用来实现实例的,JavaScript没有类的概,但是有特殊的构造函数。通过new关键字来调用自定义的构造函数,在构造函数内部,this关键字引用的是新创建的对象。
AlbertYang
2020/09/08
1.1K0
python类的私有变量
1)_xx 以单下划线开头的表示的是protected类型的变量。即保护类型只能允许其本身与子类进行访问。若内部变量标示,如:当使用“from Mimport”时,不会将以一个下划线开头的对象引入。
py3study
2020/01/15
1.3K0
Python 私有函数和私有变量
私有函数和私有变量 什么是私有函数和私有变量 无法被实例化后的对象调用的类中的函数与变量 类的内部可以调用私有函数与变量 只希望类内部业务调用使用,不希望被使用者使用 私有函数与私有变量的定义方法 在一个变量或函数前添加__(2个下横线),变量或函数名后边无需添加 class Person(object): def __init__(self, name): self.name = name self.__age = 33 # 私有 def dump(self): print(
Zkeq
2022/05/18
9800
JavaScript的构造函数
在Java语言中,我们使用构造函数是实例化对象的过程,在JavaScript语言中我们可以使用构造函数的方式创建对象,如:
伯爵
2019/10/09
1K0
JavaScript的构造函数
设计模式 - 迭代器模式 - JavaScript
迭代器模式是指提供一种方法顺序访问一个集合对象的各个元素,使用者不需要了解集合对象的底层实现。
心谭博客
2020/04/20
3630
设计模式 - 解释器模式 - JavaScript
优点显而易见,每个文法规则可以表述为一个类或者方法。这些文法互相不干扰,符合“开闭原则”。
心谭博客
2020/04/20
8180
JavaScript设计模式--迭代器模式
迭代器模式是指提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。 JavaScript中的Array.prototype.forEach
奋飛
2019/08/15
3900
对ImageIO的私有构造方法的理解
1. 来源 ---- 昨天一个朋友问我,ImageIO类中显示实现了私有的无参构造方法,它的作用是什么? 2. 最初的想法 ---- 3. 之后的理解 ---- 晚上闲下来之后,我查看了该类源码,发现其为final类(final类也就意味着不能被其他类继承),然后发现该类提供的方法都为static之后才恍然大悟。该类就是一个工具类,私有构造就是为了别人不能创建该类的对象,对于工具类而言,对象是没有任何意义的。 4. 工具类实现的总结 ---- 工具类定义为 final,可以防止被别人失误继承。 显示定义私有
山海散人
2021/03/03
3480
javascript中常用的创建对象的方法工厂模式构造函数模式原型模式混合使用构造函数模式和原型模式小结
js中创建对象最简单的方法自然是直接new一个Object然后再为其添加属性和方法,例如一下代码:
desperate633
2018/08/22
1.3K0
javascript中常用的创建对象的方法工厂模式构造函数模式原型模式混合使用构造函数模式和原型模式小结
Javascript构造函数
     构造函数注意事项: 1.默认函数首字母大写 2.构造函数并没有显示返回任何东西。new 操作符会自动创建给定的类型并返回他们,当调用构造函数时,new会自动创建this对象,且类型就是构造函数类型。 3.也可以在构造函数中显示调用return.如果返回的值是一个对象,它会代替新创建的对象实例返回。如果返回的值是一个原始类型,它会被忽略,新创建的实例会被返回。 function Person( name){                 this.name =name;            
hbbliyong
2018/03/06
1.4K0
Javascript构造函数
javascript构造函数
我们昨天前几天讨论过构造函数constructor,得出了结论 constructor是原型对象上的一个属性,默认指向这个原型的构造函数 这个结论貌似对我们平时的工作中似乎并没有什么用处,那构造函数,就真的没什么用处吗?
陌上寒
2019/04/02
1K0
javascript构造函数
JavaScript的变量
变量相当于容器,值相当于容器内装的东西,而变量名就是容器上贴着的标签,通过标签可以找到 变量,以便读、写它存储的值。
用户3519280
2023/07/07
1920
javascript设计模式四:迭代器模式
迭代器模式分为内部迭代器和外部迭代器,内部迭代器就是在函数内部定义好迭代的规则,它完全接手整个迭代的过程,外部只需一次初始调用。
前端_AWhile
2019/08/29
3970
JavaScript设计模式之迭代器模式
https://github.com/ahwgs/design-pattern-learning/tree/master/10.JavaScript%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E4%B9%8B%E8%BF%AD%E4%BB%A3%E5%99%A8%E6%A8%A1%E5%BC%8F
w候人兮猗
2020/07/01
3480

相似问题

带有构造函数原型的JavaScript私有变量

01

使用私有变量的Javascript构建器模式

13

带有私有/公共方法的Javascript模块模式

23

JavaScript构造器模式

45

C++中带有私有构造函数的工厂模式

34
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文