0

假设我们有以下示例:

常量Foo={init:函数(who){this.me=谁;},说话:函数(){console.log(this.me);}};

然后我们有了原型引用foo的新对象:

const b1=对象创建(Foo);const b2=对象创建(Foo);b1.init(“克里斯托弗”);b2.init(“Jane”);b1.speak();b2.speak();

输出如下:

克里斯托弗

但我本来希望“this”指的是原型函数的上下文。如果每个新对象只引用原型,我认为会输出以下内容:

为什么不是这样?我认为既然Foo是b1和b2的共享原型,那么修改这个我会覆盖b1和b2的变量吗?

2
  • 4
    指的是现在的调用上下文。在本例中,这是由对象.创建并存储在,b1号机组。原型不受影响。如果是这样的话,那么如果原型的所有东西都只修改原型,那么整个原型链将非常无用。 评论 2019年5月10日18:43
  • @VLAZ太棒了,谢谢你。你能给我一个答案吗?这样我就可以接受了 评论 2019年5月10日18:59

1答案1

重置为默认值
2

让我们将其分解:

const b1=对象创建(Foo);const b2=Object.create(Foo);

这些行创建两个单独的实例,使用作为原型。

b1.init(“克里斯托弗”);

你打过电话初始化以“克里斯托弗”作为论据。在这种情况下是b1号机组.初始化将“克里斯托弗”指定为b1号机组.

b2.init(“Jane”);

你打过电话初始化以“简”作为论据。在这种情况下是b2型.初始化将“Jane”指定为b2型.

b1.speak();b2.speak();

打印两个对象的。

更简单的说法是在你写它的时候是不固定的(这让你觉得它是). 这取决于函数调用时的调用方式。

常量对象={somefunc(){…}}obj.somefunc()//此===对象const foo=obj.somefuncfoo()//this==非限制模式下的窗口,this===在严格模式下未定义常量arr=[]const绑定=obj.somefunc.bind(arr)bound()//这===arrobj.somefunc.call(arr)//此===arrobj.somefunc.apply(arr)//此===arr
0

不是你想要的答案吗?浏览已标记的其他问题问你自己的问题.