gpt4 book ai didi

javascript - 在 Javascript 中确定对象类型的最佳实践

转载 作者:可可西里 更新时间:2023-11-01 01:33:58 25 4
gpt4 key购买 nike

如果你在 javascript 中有一个对象的实例,似乎很难找到它的实际类型,即

var Point2D = function Point2D(x, y) {
return {
X: x,
Y: y
}
}

var p = new Point2D(1,1);

typeof p // yields just 'Object' not 'Point2D'

我发现的一种解决方法是让对象成为它自己的原型(prototype),然后你可以通过调用 prototype.constructor.name 有效地获取它的名字,

var Point2D = function Point2D(x, y) {
return {
X: x,
Y: y,
prototype: this
}
}

new Point2D(1,1).prototype.constructor.name // yields 'Point2D'

这是一种可行的方法吗(优点/缺点是什么?)还是我错过了更好的做法?

谢谢。

最佳答案

首先,我们需要修复您构建类的方式,因为您陷入了一些 JS 陷阱并做了一些非常奇怪的事情:

function Point2D(x, y){
//Our constructor/initialization function
//when run, the 'this object will have
//Point2D.prototype as its prototype

this.x = x;
this.y = y;

//Don't return a value here! Doing so overrides
//the default "return this" that we actually want.
}

//You can put things in the Point2D prototype in order to have them
//be shared by all Point2D objects. Normally you want the methods to be shared.
Point2D.prototype.getX = function(){
return this.x;
};

//Note that there is nothing magical about the "prototype" property.
//It is just where the `new` syntax expects the prototype it will use to be.
//The actual magic property is __proto__ (don't depend on it though
// __proto__ is browser specific and unsafe/evil)

//We now can create points!
var p = new Point2D(17.0, 42.0);
p.getX();

现在我们可以处理有关获取类型名称的部分。您缺少的更好做法是首先不检查类型。从 OO 的 Angular 来看,对象的实现方式(ts 类)并不重要,重要的是它的行为方式以及它的接口(interface)是什么(公开的方法和属性)。此外,从 Javascript 的 Angular 来看,类型名称是二等黑客,不太适合实际使用的原型(prototype) OO 方案。

由于有很多原因可能会首先尝试检查类型名称,因此有许多不同的“最佳”解决方案。我能想到的一些:

  1. 如果您只关心“这个对象是否实现了特定的点接口(interface)”,那么您可以直接进行特征检查:

    function isPoint(p){
    //check if p has all the methods I expect a point to have:
    //(note that functions are truthy in a boolean context)
    return (p.getX && p.getY);
    }
  2. 如果您使用类型名称进行调度,请考虑改用方法。这是自然的 OO 方式。

    function speak(obj){
    //fake pseudo-syntax:
    if(obj is of type Cat){ console.log("meow"); }
    if(obj is of type Dog){ console.log("woof"); }
    }

    成为

    Cat.prototype.speak = function(){ console.log("meow"); };
    Dog.prototype.speak = function(){ console.log("woof"); };
  3. 如果您真的需要某种标签,您可以明确地制作一个,正如其他一些答案所指出的那样:

    Point2D.prototype.pointType = "2D";

    这里的优点是,如果需要,您可以让多个类具有相同的“类型”,并且您不必担心任何棘手的 instanceoftypeof 极端情况。

关于javascript - 在 Javascript 中确定对象类型的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7775006/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com