编程语言
首页 > 编程语言> > 封装在JavaScript中,它是否存在?

封装在JavaScript中,它是否存在?

作者:互联网

我有使用C#编程语言的经验,但我现在也必须使用JS,这对我来说相当新.

我试图在JS中开发一个简单的类仿真,如下所示:

http://jsfiddle.net/T74Zm/

function A( inputValue ) {
    this.Init( inputValue );
    this.Print();
}
A.prototype = {
    value: null,
    Init: function( inputValue ) {
        this.value = inputValue;
    },
    Print: function () {
        console.log( this.value );
    }
}

var obj = new A(40);

我试图将变量值封装在A.prototype中,但似乎是JavaScript规范所有对象都可用.

所以我的问题是:

1).如何使用OOP /访问修饰符支持非常接近静态语言的封装?

2).如何在JS中模拟一些访问修饰符,例如私有?

解决方法:

如果你想使用继承,你不能(至少AFAIK).但是对于没有继承链的对象,您可以使用闭包来获得完全相同的效果.问题是,如果你真的需要属性实际上是完全私有的.

关闭的方法

您可以执行一个函数,其中哪个闭包包含您想要私有的变量.这些私有变量实际上不属于对象,但只能由对象的方法访问.例如:

var getPersonInstance = function (name) {

    // Those are "private" properties
    var myName = name;

    return {
        getName: function () {
            return myName
        },
        setName: function (name) {
            myName = name;
        },
        sayHello = function () {
            alert('hello! my name is ' + myName);
        }
    }    
};

var person = getPersonInstance('Juan');
person.getName(); // Returns Juan
person.myName = 'Don Vito' // This sets the person.myName property, which is not the one in the closure
person.setName('John') // Works
person.sayHello(); // alert hello! my name is John

你可以在这里查看:

http://jsfiddle.net/MLF7v/1/

如果您对构造函数表示法感觉更舒服,可以执行以下操作:

(未测试)

function Person(name) {
    // Anything that is not attached to this will be private
    var myName = name;


    this.getName = function () { return myName;};
    this.setName = function (newName) {myName = newName;};
    this.sayHello = function () {alert('hey there, my name is' + myName);};
}

这与上面几乎相同,因为未使用原型并且方法被直接复制到对象中.

然而,闭包方法是内存和耗时,最糟糕的是:它们使用的变量实际上并不属于你正在使用的对象……这是一个重要的“语义”问题(这个属于对我来说,还是没有?)这让继承成为头痛的问题.原因是扩展对象的方法要么不能访问该私有伪属性(因为它们没有在超级对象闭包中定义),要么可以访问“超级对象”中的公共私有变量(方法在超级项目中定义,因此访问超级项目的关闭.这是胡说八道.

“文化”方法

在我看来,如果他/她真的想要,封装并不会阻止任何人搞乱你的代码,所以我更喜欢遵循python哲学“我们都是成熟的人”,其中包括使用一个约定来说“我想要这个属性不能从外面使用“.例如,我在私有属性前加上’_’,这意味着它们是私有的,受保护的,或者其他什么,只是远离它.你不要触摸你不应该碰的东西.

这种方法从最简单和最有效的方面开始,允许您使用继承链,因为属性在对象中而不是限制在闭包中.

var Person = function (name) {
    this._name = name;
}
Person.prototype.sayHello = function () {...};
Person.prototype.getName = function () {...};
Person.prototype.setName = function () {...};

标签:javascript,oop,object,encapsulation,prototype
来源: https://codeday.me/bug/20191007/1864447.html