首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解Javascript原型链

理解Javascript原型链
EN

Stack Overflow用户
提问于 2015-11-05 16:20:45
回答 2查看 77关注 0票数 0

如果我有一个字符串的实例,并且修改了它的构造函数的原型,那么每个字符串实例的原型都有该属性(正如预期的那样)。

代码语言:javascript
复制
 "test string".constructor.prototype.thing = function() {return this;}
 console.log("new string".thing());//prints "new string"

但是,如果我修改了字符串构造函数的原型,那么这将不再有效:

代码语言:javascript
复制
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将不具有该属性,但是它的父对象将拥有该属性,对吗?因此,字符串的所有实例也应该具有对该属性的访问权限。我的想法哪里错了?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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,它是一个原型链的结束对象。

票数 1
EN

Stack Overflow用户

发布于 2015-11-05 18:42:49

如果您想要创建比一个更长的原型链,以支持来自超类的继承,通常的方法是将构造器的原型设置为本身从原型继承的类实例。下面的示例说明了这一点:

代码语言:javascript
复制
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中的三个变量是:

代码语言:javascript
复制
a   inherited from c1's prototype, via c2's prototype
b   inherited from c2's prototype
c   stored directly in y

注意,它遵循两个级别的原型链,以便从a访问y

这就是你想知道怎么做的吗?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33549677

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档