相关疑难解决方法(0)

通过原型定义方法vs在构造函数中使用它 - 真的是性能差异?

在JavaScript中,我们有两种方法可以创建"类"并赋予它公共功能.

方法1:

function MyClass() {
    var privateInstanceVariable = 'foo';
    this.myFunc = function() { alert(privateInstanceVariable ); }
}
Run Code Online (Sandbox Code Playgroud)

方法2:

function MyClass() { }

MyClass.prototype.myFunc = function() { 
    alert("I can't use private instance variables. :("); 
}
Run Code Online (Sandbox Code Playgroud)

我读了很多次,人们使用方法2效率更高,因为所有实例共享相同的函数副本而不是每个实例都有自己的副本.通过原型定义函数有一个巨大的缺点 - 它使得无法拥有私有实例变量.

即使理论上,使用方法1给对象的每个实例赋予它自己的函数副本(因此使用更多的内存,更不用说分配所需的时间) - 实际上实际发生了什么?似乎优化Web浏览器可以很容易地识别这种非常常见的模式,并且实际上让对象的所有实例引用通过这些"构造函数"定义的相同函数副本.然后,如果稍后显式更改,它只能为实例提供自己的函数副本.

关于两者之间的性能差异的任何见解 - 或甚至更好的现实世界经验 - 都将非常有帮助.

javascript performance memory-management prototype

59
推荐指数
1
解决办法
1万
查看次数

封装在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);
Run Code Online (Sandbox Code Playgroud)

我试图封装变量valueA.prototype,但它似乎是JavaScript的规范,所有的对象都是可用的.

所以我的问题是:

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

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

javascript oop encapsulation prototype object

1
推荐指数
2
解决办法
1313
查看次数