【问题标题】:Javascript JQuery Property ScopeJavascript JQuery 属性范围
【发布时间】:2017-07-28 11:19:07
【问题描述】:

作为初学者,我正在阅读 Nick Morgan 的 Javascript for Kids,我生成了以下 JavaScript 代码 -

var Car = function(x,y) {
    this.x = x;
    this.y = y;
}

Car.prototype.draw = function () {
    var carHtml = '<img src="http://nostarch.com/images/car.png">';
    this.carElement = $(carHtml);

    this.carElement.css({
        position:"absolute",
        left:this.x,
        top:this.y
    });
}

var tesla = new Car (20,20);
var nissan = new Car (100,200);

tesla.draw();
nissan.draw();

现在,我使用 JavaScript 构造方法创建对象并使用 prototypes 技术创建 draw 方法,我可以调用从 car 的每个实例创建的汽车对象。

根据我在 Python 中的经验,所有方法都可以访问从类的实例创建的对象的所有属性。

我的问题是,汽车构造函数创建的对象中的所有方法都可以访问属性吗?

【问题讨论】:

  • 是的,他们是。
  • 请注意,您的 Car 构造函数根本不创建任何方法。将draw 添加到Car.prototype 的代码创建了唯一的“方法”(这是松散意义上的“方法”;从 ES2015 开始,JavaScript 有了更严格的方法形式)。

标签: javascript jquery object properties


【解决方案1】:

我的问题是,汽车构造函数创建的对象中的所有方法都可以访问属性吗?

任何有权访问该对象的代码都可以访问它们。因此,如果Car 构造函数(或其他任何东西)创建的方法可以访问该对象,那么是的,属性将可以访问它。如果 Car 构造函数创建的方法没有(例如,它在完全不同的对象上创建方法),那么该方法可能无法访问属性。

请注意,如果方法是通过this 访问对象,则方法是否有权访问对象可能会因调用方式而异。更多:How to access the correct this inside a callback?

JavaScript 目前还没有真正的私有属性。如果您可以访问该对象,您就可以访问它的所有真实属性。

有一个proposal,目前处于第 3 阶段*,用于向通过class 语法创建的 JavaScript 对象添加私有字段。 (它曾经是一个单独的私有属性提案,但它与那个类字段提案相结合。)迄今为止,私有数据经历了漫长的曲折之路,虽然该提案已进入第 3 阶段,但它仍有相当多的旅行的道路。


* Explanation of stages

【讨论】:

    【解决方案2】:

    像您定义的属性是公共属性(在 js 中没有受保护的东西),因此可以从具有 object 实例的任何其他范围访问,真正的私有属性(使用“var”关键字创建)是只能在它们的闭包内访问(意思是:它们定义的功能块或嵌套块)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-22
      • 2014-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-26
      • 2014-10-24
      相关资源
      最近更新 更多