JavaScript等效的后期静态绑定

时间:2013-08-20 19:05:26

标签: javascript

在PHP中,我有以下类定义

class my_pet{

    public static $name = "paulie";

    public static function get_name(){
        return static::$name;
    }

}

class my_dog extends my_pet{

    public static $name = "stacey";

}

当我使用

回音时
echo my_dog::get_name();

我会得到“斯泰西”。

如果我改变

  

return static :: $ name

  

return self :: $ name;

答案变成了“保利”。

在JavaScript中,我有以下对象构造函数

function my_pet(){
    this.name = "paulie";
}

my_pet.prototype.get_name = function(){
    return this.name;
}

function my_dog(){
    this.name = "stacey";
}

my_dog.prototype = new my_pet();
my_dog.prototype.constructor = my_dog;

my_pet_instance = new my_dog();

当我使用

调用我的方法时
  

警报(my_pet_instance.get_name());

我将永远得到“斯泰西”。

是否有一个晚期的静态绑定等效于JavaScript,所以我可以得到“paulie”而不是“stacey”?

3 个答案:

答案 0 :(得分:4)

在您的JavaScript代码中,没有任何静态(甚至是“静态”)。

要模拟静态变量,可以直接将属性附加到构造函数:

function my_pet(){}
my_pet.name = "paulie";

function my_dog(){}
my_dog.name = "stacey";

但是,要实现您的目标,您可能需要使用原型链:

function my_pet(){}
my_pet.prototype.name = "paulie";

function my_dog(){
    this.name = "stacey";
}
my_dog.prototype = Object.create(my_pet.prototype);

var stacey = new my_dog();

console.log(stacey.name); //stacey
console.log(my_dog.prototype.name); //paulie
delete stacey.name; // no more shadowing
console.log(stacey.name); // paulie

答案 1 :(得分:1)

虽然JavaScript中的语义和机制不同,但您仍然可以从原型对象访问name属性的子类值。尝试将此行添加到代码的末尾:

my_dog.prototype.name; // returns "paulie"

答案 2 :(得分:0)

试试这个Class.js javascript库。

在每个动态和静态this上下文中都实现了2个关键属性 - this.selfthis.static。 它的行为与PHP中的后期静态绑定相同。 this.selfthis.static包含类(原型函数)定义,其中包含内置属性NameNamespaceFullname。阅读更多项目自述文件 - 功能。

语法可以以任何已用于编写类的方式进行自定义(第7次演示 - Class.js - example to customize syntax)。

适用于所有旧浏览器,不支持ES6,节点 Windows脚本宿主环境以及 Adob​​e脚本即可。

所以上面的代码看起来应该是:

Class.Define('MyPet', {
    Static: {
        GetStaticName: function () {
            return this.static.Name;
        },
        GetSelfName: function () {
            return this.self.Name;
        }
    }
});

Class.Define('MyDog', {
    Extend: MyPet
});

console.log(MyPet.GetSelfName()); // MyPet
console.log(MyDog.GetSelfName()); // MyPet

console.log(MyPet.GetStaticName()); // MyPet
console.log(MyDog.GetStaticName()); // MyDog