我们可以在对象构造函数中分配一个公共方法吗? (JavaScript的)

时间:2013-02-18 04:04:38

标签: javascript prototype

我正在阅读javascript中的原型,在文章http://phrogz.net/js/classes/OOPinJS.html中我读到我们无法在javascript中的对象构造函数中分配公共方法?原型方法与静态方法的不同之处是什么?使用它们有什么好处?

3 个答案:

答案 0 :(得分:2)

JavaScript并不适合大多数OOP概念和范例,尤其是在尝试模拟继承之后。不应该在OOP术语中考虑原型与“特权”方法,而应该根据JavaScript如何实例化对象来考虑事物。拿这个简单的“课堂”:

var id = 0;

function myClass()
{
     var that = this;
     id++; //closure, each new instance gets a unique id
     this.id = id;

     this.toString = function()
     {
         return that.id.toString();
     }
}

这个类的实例化如下:

var classInstance = new myClass();

这不是我一定要推荐的模式,重点是要说明每个实例,每个实例都有自己唯一的toString函数。这意味着如果您实例化100 classInstances,并在其中一个上更改toString以执行其他操作,则只有该实例具有该新功能。

意味着对于每个实例,每个特权方法也会与它一起实例化。如果要实例化大量实例,那么可能会产生很大的性能差异。我有一个案例,通过将我的特权方法转换为原型方法,我看到了可测量的速度提升。

说到原型方法,这可能是这样的:

var id = 0;

function myClass()
{
     id++; //closure, each new instance gets a unique id
     this.id = id;
}

myClass.prototype.toString = function()
{
    return this.id.toString();
}

在这种情况下,无论您拥有多少myClasses,您只需实例化toString方法一次。如果它发生变化,则会更改所有myClasses

就我个人而言,我在大多数JavaScript类中都使用特权方法,因为它看起来更干净,只有原型链才会打扰,如果我知道它会被实例化很多次。同样能够访问私有变量允许你有一些隐藏的信息,而不是被迫公开任何被访问的变量。

答案 1 :(得分:2)

  

我读到我们无法在javascript中的对象构造函数中分配公共方法吗?

是的,文章提到了这个:

function MyObj(name)
{
    this.name = name;
}

MyObj.prototype.sayHello = function() {
    alert('hello ' + this.name);
}

new MyObj('world').sayHello();

如您所见,公共方法sayHello()在原型中声明,它在构造函数之外完成。这就是JavaScript的工作原理。

  

原型方法与静态方法的不同之处是什么?使用它们有什么好处?

原型方法仅“附加”到对象上。对于静态方法,您需要使用此构造:

var MyStaticThing = {
    name: 'world',
    sayHello: function() {
        alert('hello ' + this.name);
    }
}

MyStaticThing.sayHello();

答案 2 :(得分:1)

“使用它们的优势”......你指的是哪一个?通常,优点是使用原型方法(通常是对象构造),而不是像javascript中的静态或经典方法。你要找的答案真的太长了,不能在这里解决,但简短的回答是javascript基于一个原型对象继承系统(意思是对象可以在运行中创建并可以继承到另一个),而不是经典系统(对象可能只从类继承,即Java,C ++等)

虽然你可以用经典的方式在javascript中创建对象 - 因为语言是灵活的 - 这是一种糟糕而混乱的方式。原型对象构造允许您执行重要和好的事情,如数据隐藏,访问超级方法等。就像我说这是一个冗长的主题,真的很大,可以在一个小文本框中使用。