javascript中的类和成员范围

时间:2014-03-16 17:56:16

标签: javascript

首先跳转到代码:

function myClass(arg1,arg2){
    this.arg1=arg1;
    this.arg2=arg2;
}

myClass.prototype.sayArg=function(){
    console.log("First Arg is "+ arg1);
}
  1. 为什么我必须添加'prototype'来为类声明一个函数?即使它会延长,默认情况下每个孩子都不会得到这种方法吗?实际上是什么,我从开始就把“阶级”和“原型”搞得一团糟。我读了link,还不明白:(

  2. 如果我使用该文学(或只是'= new Object()')方法定义我的类,我如何在以后定义构造函数,以便我可以使用

    var anObject=new myClass(arg1,arg2);
    
  3. 如果你注意到,我没有在第6行使用'this.arg',这是一个错误,这让我怀疑。我已经指定了'myClass'。意味着它属于myClass,仍然无法访问其'arg1'成员?为什么我要用'这个'。在同一课堂上接听它?这是私人会员吗?但是由于函数属于同一个类,它应该可以访问它(在c ++中的类型)。

  4. 谢谢:)

2 个答案:

答案 0 :(得分:4)

建立一个如何实现Javascript对象的心智模型非常重要:如果您来自C ++背景,那么请考虑这个可能的模型

javascript中的所有对象属于同一类,类#34;对象"

每个对象都定义为

class Object {
    std::map<std::string, Object *> attributes;
};

这意味着例如

  1. 属性集不固定,您可以在运行时将属性添加到特定对象实例

  2. 继承并不像在C ++中那样工作

  3. 每个对象都有一个名为constructor

    的特殊属性

    对象的constructor是用于实例化对象的函数。例如,如果你写

    function Person(first_name, last_name) {
        this.first_name = first_name;
        this.last_name = last_name;
    }
    

    然后执行

    var p = new Person("Andrea", "Griffini");
    alert(p.constructor === Person);
    

    将显示&#34; true&#34;在消息框中。

    构造函数也是一个对象

    constructor的{​​{1}}为constructor,您可能认为它也是一个对象,它本身就是构造函数。

    构造函数具有名为Function

    的特殊属性

    这个特殊属性允许继承等。 Javascript遵循的规则很简单:访问对象prototype的属性attr

    1. 如果实例x本身具有请求的属性,则返回值
    2. 否则x会查找x.constructor.prototype而不是attr
    3. 第二步也是递归的,这意味着如果x没有属性,则会搜索x.constructor.prototype,依此类推。

      设置属性时,Javascript只是在实例中设置它,而不是跟随x.constructor.prototype.constructor.prototype链。

      这解释了这种看似奇怪的行为......

      constructor.prototype

      function Person(first_name, last_name) { this.first_name = first_name; this.last_name = last_name; } Person.prototype.display = function() { return this.first_name + ", " + this.last_name; } var p = new Person("Andrea", "Griffini"); var q = new Person("John", "Smith"); q.display = function() { return "... not sure ..."; } alert(p.display()); // Says "Andrea, Griffini" alert(q.display()); // Says "... not sure ..." 是Javascript

      中的运行时概念

      this可以简单地看作是由Javascript自动设置的全局变量:更具体地说,当您编写

      this

      obj.method(...); 属性照常查找,但在被调用method之前设置为this并在方法返回后恢复为其当前值;换句话说,会发生什么或多或少:

      obj

      它也意味着两个片段

      // Not real code, just to show the concept
      var old_this = this;
      this = obj;
      method(...);
      this = old_this;
      

      等效,因为在第一种情况下,方法的代码将以// First case var f = obj.method; f(); // Second case obj.method(); 为&#34;全局对象&#34;执行,而在第二种情况下在执行方法代码期间,this值将为thisobj魔法仅在您调用属性查找结果时才会发生...即使仅使用this也不会与[obj.method][0]()相同,因为obj.method()将是数组(在执行方法代码期间已经查找了属性this

      这不是全部真相

      这个回复只是想让你粗略地描述Javascript中或多或少的工作方式,当然他们并不是真理,但我认为只有这几个想法应该能够带你走得更远Javascript编程。

      总而言之,你需要阅读更多内容。

答案 1 :(得分:3)

JavaScript没有类,只有对象......

  

“其中一个主要区别是JavaScript没有类;   相反,类功能是由对象完成的   原型“。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/A_re-introduction_to_JavaScript#Objects

I recommend you read this ...这可能是我见过的最好的JavaScript介绍。这不是一个很大的阅读,不会花很长时间,应该帮助回答你的所有问题。