是javascript对象吗;开放式;像鲁比?

是javascript对象吗;开放式;像鲁比?,javascript,google-apps-script,Javascript,Google Apps Script,在Ruby中,我可以使用与我声明自己的语法相同的语法添加和修改任何类、对象或方法的功能,因为Ruby具有“开放类” javascript是这样的吗 例如 在我的例子中,我想改变Google Apps脚本处理URL对象的方式,这样每次我计算URL对象时,URL对象本身都会确保它以一个协议开头://(默认情况下为http://)。是 需要注意的是,您如何定义“类”与Ruby中的定义非常不同。但是你可以达到同样的效果 这个红宝石: #ruby class Foo # no methods yet

在Ruby中,我可以使用与我声明自己的语法相同的语法添加和修改任何类、对象或方法的功能,因为Ruby具有“开放类”

javascript是这样的吗

例如

在我的例子中,我想改变Google Apps脚本处理URL对象的方式,这样每次我计算URL对象时,URL对象本身都会确保它以一个协议开头://(默认情况下为http://)。

需要注意的是,您如何定义“类”与Ruby中的定义非常不同。但是你可以达到同样的效果

这个红宝石:

#ruby
class Foo
  # no methods yet
end

foo = Foo.new

class Foo
  def bar
    'bar'
  end
end

foo.bar #=> 'bar'
将具有此等效的JavaScript实现:

// js
var Foo = function() {};

var foo = new Foo();

Foo.prototype.bar = function() {
  return 'bar';
};

foo.bar(); // 'bar'

您甚至可以同样轻松地覆盖这些内容:

var oldBar = Foo.prototype.bar;
Foo.prototype.bar = function() {
  return "Called oldBar and got: "+ oldBar.call(this);
};

foo.bar(); // "Called oldBar and got: bar"

使用getter和setter查看此类:

function User(){
this._name = "";
}
User.prototype.setName = function(name){this._name = name;}
User.prototype.getName = function(){return this._name;}
user = new User();
user.setName("somename");
alert(user.getName(););

是的,您可以自由修改对象。您可以修改特定对象
object.overrideProperty=…
,或通过其
prototype
属性
object.prototype.inheritedMethod=…
修改从给定类派生的所有对象

请记住,重新定义方法可能很棘手,因为新定义的范围与原始定义的范围不同:

var BaseClass;

(function(){
    var defaults = { ... };

    BaseClass = function(){
        this.someValue = defaults.someValue;
    };
}());
也可能发生这样的情况:类定义位于闭包中,并且在JIT生成方法或属性时,您没有实际的方法来重写它。在这种情况下,需要分别覆盖感兴趣的每个对象的属性:

(function(){
    var defaults = { ... },
    BaseObject = (function(){
        var obj = function(){
            this.someValue = defaults.someValue;
        };

        return obj;
    }());
}());

你在问题中特别提到了谷歌应用程序脚本。由于气体是一种气体,因此对象定义和扩展的“常用方法”适用,如其他答案所述


然而,有一个非常恼人的例外:你不能扩展谷歌类的原型。你可以在问题追踪器上找到关于这一点的评论。它被标记为“不会修复”。

在现代JavaScript运行时中,可以保护对象属性不被修改。例如
object.defineProperty