У меня есть такая простая идея, вы можете попробовать
class A {}
class B {}
$dynamicClassName = "A";
eval("class DynamicParent extends $dynamicClassName {}");
class C extends DynamicParent{
// extends success
// Testing
function __construct(){
echo get_parent_class('DynamicParent'); exit; //A :)
}
}
Это потому, что ""
является строковым примитивом, но когда вы вызываете .IsEmpty ()
, он неявно преобразуется в String
.
Вам нужно будет вызвать .toString () для него:
String.prototype.IsEmpty = function() {
return (this.toString() === "");
}
Интересно, что это зависит от браузера - тип этого
- это строка
в Chrome.
] Как указывает @pst, если бы вы преобразовали другим способом и сравните this === new String ("");
, это все равно не сработает, поскольку это разные экземпляры.
=== - это идентификатор (тот же объект; x равно x **). == равно равенство (то же значение; x выглядит как y).
Давайте поиграем (Rhino / JS 1.8):
{} === {} // false
new String("") === new String("") // false
typeof new String("") // object
"" === "" // true
typeof "" // string
f = function () { return "f" };
"foo" === f() + "oo" // true
String.prototype.foo = function () { return this; };
typeof "hello".foo() // object -- uh, oh! it was lifted
Итак, что только что произошло?
Разница между строкой объект и строка. Конечно, следует использовать сравнение на равенство (или .length).
Доказательство в pudding , раздел 11.9.6 обсуждает алгоритм оператора ===