Javascript:复制的变量和原型

Javascript: Copied Variables and Prototypes

本文关键字:原型 变量 复制 Javascript      更新时间:2023-09-26

好的,所以Javascript是一种'原型'语言,据我所知,这意味着它具有这样的东西:

var c = document.getElementById('myCanvas');
c.ctx = c.getContext('2d');

现在,如果我这样做:

var c = document.getElementById('myCanvas');
c.ctx = c.getContext('2d');
c = document.getElementById('newCanvas');

c.ctx 是否会在影响全新画布的同时保留并发挥作用? 谢谢!

我的实验说不,但我问是因为也许我错过了什么。 如果理论上这不应该奏效,你有什么好的方法可以相对容易地绕过它吗? (或者不那么容易,但容易当然是偏好!

c.ctx会在影响全新画布的同时保留并发挥作用吗?

不,您正在为c创建一个全新的参考。

所以Javascript是一种"原型"语言

那为什么不在原型中定义你想要什么呢?

Object.defineProperty(
    HTMLCanvasElement.prototype,
    'ctx',
    {
        'get': function () { return this.getContext('2d'); },
        'configurable': true
    }
);

现在,所有<canvas>元素在通过其 DOM 接口访问时都将具有一个属性 ctx该属性获取其上下文。

如果您对缓存的上下文感到满意,则可以改用它

function () { return this.ctx = this.getContext('2d'); }

这会在实例上设置一个新属性,该属性隐藏原型的 getter。

当你分配这个:

c = document.getElementById('newCanvas');

您将整个 c 变量替换为对新对象的引用。 不会保留前一个c对象的先前属性。

在你的代码中

var c = document.getElementById('myCanvas');
c.ctx = c.getContext('2d');
c = document.getElementById('newCanvas');

在最后一行,你只是覆盖了 c 变量。

你可以把它想象成运行这个

var c = document.getElementById('myCanvas');
c.ctx = c.getContext('2d');
c = 3;

假设您编写的代码确实意味着什么:不过您很幸运,ctx 内置了一个画布引用(它与您想要的相反,但这是相同的交易)

ctx.canvas;