5

在 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();

我会得到“斯泰西”。

如果我改变

返回静态::$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”?

4

3 回答 3

5

在您的 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
于 2013-08-20T19:10:10.093 回答
1

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

my_dog.prototype.name; // returns "paulie"
于 2013-08-20T19:32:26.180 回答
1

试试这个Class.js javascript 库。

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

可以以您已经用来编写类的任何方式自定义语法(第 7 个演示 - Class.js - 自定义语法的示例)。

它适用于所有不支持 ES6的旧浏览器、 NodeWindows Script Host环境以及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
于 2017-07-24T23:14:05.240 回答