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

我们可以在对象构造函数中分配公共方法吗?(javascript),javascript,prototype,Javascript,Prototype,我正在阅读javascript中的原型,在一篇文章中我读到,我们不能在javascript中的对象构造函数中分配公共方法?原型方法与静态方法有何不同?使用它们的优势是什么?“使用它们的优势”…您指的是哪一种?通常,与javascript中的静态或经典方法相比,优势在于使用原型方法(以及对象构造)。您所寻找的答案实在太长,无法解决,但简短的答案是JavaScript是基于原型对象继承系统(即可以创建对象并可以继承一个),而不是一个经典系统(对象只能继承类,即java、C++等)。 虽然您可以用经典

我正在阅读javascript中的原型,在一篇文章中我读到,我们不能在javascript中的对象构造函数中分配公共方法?原型方法与静态方法有何不同?使用它们的优势是什么?

“使用它们的优势”…您指的是哪一种?通常,与javascript中的静态或经典方法相比,优势在于使用原型方法(以及对象构造)。您所寻找的答案实在太长,无法解决,但简短的答案是JavaScript是基于原型对象继承系统(即可以创建对象并可以继承一个),而不是一个经典系统(对象只能继承类,即java、C++等)


虽然您可以用经典的方式在javascript中创建对象——因为该语言非常灵活——但这是一种糟糕而混乱的方式。原型对象构造允许你做一些重要而有益的事情,比如数据隐藏,访问超级方法,等等。就像我说的,这是一个冗长的主题,在一个小文本框中就可以完成

JavaScript并不适合大多数OOP概念和范例,尤其是当您尝试模拟继承时。在OOP术语中,不要考虑原型与“特权”方法,而应该考虑JavaScript如何实例化对象。以这个简单的“类”为例:

这个类是这样实例化的:

var classInstance = new myClass();
这不是我必须推荐的模式,重点是说明对于每个实例化,每个实例都有自己独特的
toString
函数。这意味着,如果实例化100个
classInstances
,并将其中一个
更改为String
,以执行其他操作,则只有一个实例将具有该新功能

这也意味着,对于每个实例,每个特权方法都会与它一起实例化。如果您正在实例化大量实例,这可能会造成很大的性能差异。我有一个案例,通过将我的特权方法转换为原型方法,我看到了一个可衡量的速度改进

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

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();
}
在这种情况下,无论有多少
myclass
,您只需实例化
toString
方法一次。如果它改变了,那么所有的
myclass
都会改变

就我个人而言,我在我的大多数JavaScript类中使用特权方法,因为它看起来更干净,而且只有在我知道原型链将被实例化大量次的情况下,才会对原型链产生麻烦。此外,能够访问私有变量还可以让您有一些信息隐藏的假象,而不是被迫将任何访问的变量公开

我读到我们不能在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();

公共方法的可能副本需要在原型中声明(在构造函数之外进行)。
var MyStaticThing = {
    name: 'world',
    sayHello: function() {
        alert('hello ' + this.name);
    }
}

MyStaticThing.sayHello();