在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”?
答案 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.self
和this.static
。
它的行为与PHP中的后期静态绑定相同。 this.self
和this.static
包含类(原型函数)定义,其中包含内置属性Name
,Namespace
和Fullname
。阅读更多项目自述文件 - 功能。
语法可以以任何已用于编写类的方式进行自定义(第7次演示 - Class.js - example to customize syntax)。
适用于所有旧浏览器,不支持ES6,节点, Windows脚本宿主环境以及 Adobe脚本即可。
所以上面的代码看起来应该是:
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