JavaScript类和可变范围

我对JS比较新,而且我正在正确地模拟OOP原则.

我想我有两个问题.第一个问题是关于声明变量的许多方法.

说我有一个班:

function clazz(a)
{
    this.b = 2;
    var c = 3;
    this.prototype.d = 4; // or clazz.prototype.d = 4?
}

var myClazz = new clazz(1);

我在以下评估中是否正确:

a是具体实例的私有变量(即,不同的clazz实例将具有唯一和独立的变量’a’).它可以从clazz内进行访问:“a”.

b是一个具体实例的公共变量.它可以从clazz中被访问为’this.b’,从外部的clazz可以被访问’myClazz.b’.

c是一个静态或类特定的私有变量(即不同的clazz实例将共享相同的’c’变量).它可以从任何情况下的clazz访问为“c”,并且clazz的实例的变化反映在所有的clazz实例中.

d是一个静态/类特定的公共变量.它可以从任何地方通过’clazz.prototype.d’或’myClazz.prototype.d’访问.

我对我的理解变量方案的总体问题是,没有办法声明一个非静态的私有变量(即该类的每个实例的唯一版本).

第二个问题是关于不同类型的类声明.

我一直在使用:

var MySingleton = new function() {...};

创造单身人士.它是否正确?在这种情况下,我也不确定“新”关键字的效果,以及如下附加()函数括号到声明结尾:

var MySingleton = new function() {...}();

我一直在使用这个模式来声明一个类,然后实例化该类的实例:

function myClass() {...};
var classA = new myClass();
var classB = new myClass();

这是正确的方法吗?

解决方法

你是对的a和b:

a是一个论证,仅在constructor function的范围内可用.

bis一个公共实例变量,在使用该构造函数创建的所有实例上可用.

c是一个私有变量,只能在构造函数中访问.

d声明是无效的,因为原型对象只能在constructor functions上使用,如Clazz.prototype.d = 3;如果这样做,变量将被共享,但是可以在一个具体实例,默认值将被隐藏(通过原型链).

对于“私有变量”,您可以使用您声明c的方式,例如:

function Clazz(){
    var c = 3; // private variable

    this.privilegedMethod = function () {
      alert(c);
    };
}

特权方法是公共的,但是可以访问构造函数内部声明的“私有”变量.

为了创建单例,最简单的方法可能是使用一个对象文字,如:

var myInstance = {
  method1: function () {
    // ...
  },method2: function () {
    // ...
  }
};

如果您想要在单身份实例上的私人会员,您可以:

var myInstance = (function() {
  var privateVar = '';

  function privateMethod () {
    // ...
  }

  return { // public interface
    publicMethod1: function () {
      // all private members are accesible here
    },publicMethod2: function () {
    }
  };
})();

这被称为模块模式,它基本上允许您通过使用closures来将私有成员封装在对象上.

更多信息:

> Private Members in JavaScript
> Introduction to Object Oriented JavaScript

编辑:关于你发布的语法:

var mySingleton = new (function() {
  // ...
})();

通过使用新的运算符,您将在一个步骤中声明和使用一个“匿名构造函数”,它将生成一个新的对象实例,但它是有效的,但我个人更喜欢使用“模块”模式方法来创建自己的对象实例(并避免新).

另外,阅读新的函数(){},我认为这不是真的直觉,可能会造成混乱,如果你不明白新的操作如何工作.

关于括号,它们是可选的,如果不添加参数,新的运算符将调用函数构造函数(参见ECMA-262,11.2.2).

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


kindeditor4.x代码高亮功能默认使用的是prettify插件,prettify是Google提供的一款源代码语法高亮着色器,它提供一种简单的形式来着色HTML页面上的程序代码,实现方式如下: 首先在编辑器里面插入javascript代码: 确定后会在编辑器插入这样的代码: <pre
这一篇我将介绍如何让kindeditor4.x整合SyntaxHighlighter代码高亮,因为SyntaxHighlighter的应用非常广泛,所以将kindeditor默认的prettify替换为SyntaxHighlighter代码高亮插件 上一篇“让kindeditor显示高亮代码”中已经
js如何实现弹出form提交表单?(图文+视频)
js怎么获取复选框选中的值
js如何实现倒计时跳转页面
如何用js控制图片放大缩小
JS怎么获取当前时间戳
JS如何判断对象是否为数组
JS怎么获取图片当前宽高
JS对象如何转为json格式字符串
JS怎么获取图片原始宽高
怎么在click事件中调用多个js函数
js如何往数组中添加新元素
js如何拆分字符串
JS怎么对数组内元素进行求和
JS如何判断屏幕大小
js怎么解析json数据
js如何实时获取浏览器窗口大小
原生JS实现别踩白块小游戏(五)
原生JS实现别踩白块小游戏(一)