如果我有一个字符串的实例,并且修改了它的构造函数的原型,那么每个字符串实例的原型都有该属性(正如预期的那样)。
"test string".constructor.prototype.thing = function() {return this;}
console.log("new string".thing());//prints "new string"但是,如果我修改了字符串构造函数的原型,那么这将不再有效:
String.constructor.prototype.thing = function() {return this;}
console.log("new string".thing());//returns "new string".thing() is not a function如果我使用字符串.proto语法,情况也是一样的。为什么会这样呢?我当时的印象是,JavaScript在寻找房产时会一路走上原型链。如果我向String.constructor.prototype添加了一个属性,那么String将不具有该属性,但是它的父对象将拥有该属性,对吗?因此,字符串的所有实例也应该具有对该属性的访问权限。我的想法哪里错了?
发布于 2015-11-05 16:33:17
但是,如果我修改了字符串构造函数的原型,那么这将不再有效:
构造函数是一个函数,所以任何构造函数的构造函数都是Function。
这意味着“字符串构造函数的构造函数的原型”是Function.prototype。
如果向Function.prototype添加某项内容,它将显示为任何函数的成员,而不是任何字符串的成员。
你可以和Object.getPrototypeOf玩一玩,得到一个想法。
$ (Object.getPrototypeOf( Object (""))字符串{length: 0,[PrimitiveValue]:""} $Object.getPrototypeOf对象{} $ Object.getPrototypeOf(Object.getPrototypeOf(Object.getPrototypeOf(Object("")))) null
原语字符串的对象值是一个String,它是一个原型链的结束对象。
发布于 2015-11-05 18:42:49
如果您想要创建比一个更长的原型链,以支持来自超类的继承,通常的方法是将构造器的原型设置为本身从原型继承的类实例。下面的示例说明了这一点:
function c1(b) {
this.b = b;
}
c1.prototype = {a:111};
x = new c1(222);
function c2(c) {
this.c = c;
}
c2.prototype = x;
y = new c2(333);
alert(y.a + ", " + y.b + ", " + y.c);y中的三个变量是:
a inherited from c1's prototype, via c2's prototype
b inherited from c2's prototype
c stored directly in y注意,它遵循两个级别的原型链,以便从a访问y。
这就是你想知道怎么做的吗?
https://stackoverflow.com/questions/33549677
复制相似问题