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

Can we assign a public method inside a object constructor ? (javascript)

本文关键字:一个 方法 javascript 对象 构造函数 分配 我们      更新时间:2023-09-26

我在一篇文章中读到了javascript中的原型http://phrogz.net/js/classes/OOPinJS.html我读到我们不能在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();

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类中都使用特权方法,因为它看起来更干净,只有当我知道原型链将被实例化大量时,它才会麻烦原型链。此外,能够访问私有变量可以让你在某种程度上隐藏信息,而不是被迫公开任何访问的变量。

"使用它们的优势"。。。你指的是哪一个?一般来说,优势在于使用原型方法(通常是对象构造),而不是javascript中的静态或经典方法。您要寻找的答案实在太长了,无法在这里解决,但简短的答案是javascript基于原型对象继承系统(意味着对象可以动态创建,并且可以从一个继承到另一个),而不是经典系统(对象只能从类继承,即Java、C++等)

虽然你可以用javascript以经典的方式创建对象,因为这种语言非常灵活,但这是一种糟糕而混乱的方法。原型对象构建可以让你做一些重要而好的事情,比如数据隐藏、访问超级方法等。就像我说的,这是一个冗长的主题,真的太大了,可以在一个小文本框中进行处理。