JavaScript类和可变范围

前端之家收集整理的这篇文章主要介绍了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).

猜你在找的JavaScript相关文章