javascript中的类和成员的作用域

javascript中的类和成员的作用域,javascript,Javascript,先跳到代码: function myClass(arg1,arg2){ this.arg1=arg1; this.arg2=arg2; } myClass.prototype.sayArg=function(){ console.log("First Arg is "+ arg1); } 为什么我必须添加“prototype”来声明类的函数?即使它会得到扩展,是否每个孩子在默认情况下都不会得到这个方法?实际上是什么,我从一开始就在“类”和“原型”之间玩杂耍。我读了这篇

先跳到代码:

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

myClass.prototype.sayArg=function(){
    console.log("First Arg is "+ arg1);
}
  • 为什么我必须添加“prototype”来声明类的函数?即使它会得到扩展,是否每个孩子在默认情况下都不会得到这个方法?实际上是什么,我从一开始就在“类”和“原型”之间玩杂耍。我读了这篇文章,还不明白:(

  • 如果我用这个方法(或者仅仅是一个“=newobject()”)来定义我的类,那么我以后如何定义一个构造函数,以便使用它呢

    var anObject=new myClass(arg1,arg2);
    
  • 如果您注意到,我在第6行中没有使用“this.arg”,这是一个错误,这给了我最后一个疑问。我已经指定了“myClass”。这意味着它属于myClass,但它仍然无法访问其“arg1”成员?为什么我必须使用“this”。当它在同一个类中时访问它?它是私有成员吗?但作为函数在同一类中,应该得到它(C++中的一种)。


  • 谢谢:)

    JavaScript没有类,只有对象

    “关键区别之一是JavaScript没有类; 相反,类功能是通过对象来实现的 原型。”


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

    JavaScript没有类,只有对象

    “关键区别之一是JavaScript没有类; 相反,类功能是通过对象来实现的 原型。”


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

    < p>重要的是构建一个JavaScript对象如何实现的心智模型:如果你来自C++背景,那么考虑这个可能的模型

    javascript中的所有对象都属于同一类,即类“Object” 每个对象都定义为

    class Object {
        std::map<std::string, Object *> attributes;
    };
    
    然后执行

    var p = new Person("Andrea", "Griffini");
    alert(p.constructor === Person);
    
    将在消息框中显示“true”

    构造函数也是一个对象
    构造函数
    构造函数
    函数
    ,正如您可能猜到的那样,它也是一个对象,本身就是构造函数

    构造函数有一个名为
    prototype
    这个特殊属性允许继承和其他东西。Javascript遵循的规则很简单:当访问对象的属性
    attr
    x

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

    设置属性时,Javascript只是在实例中设置属性,而不是遵循
    构造函数.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中的一个运行时概念
    
    这个
    可以简单地看作是一个全局变量,由Javascript自动设置:更具体地说,是在编写时

    function Person(first_name, last_name) {
        this.first_name = first_name;
        this.last_name = last_name;
    }
    
    obj.method(...);
    
    像往常一样查找
    方法
    属性,但在调用
    之前,此
    设置为
    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();
    
    不是等效的,因为在第一种情况下,方法的代码将以
    作为“全局对象”执行,而在第二种情况下,
    值将在方法代码执行期间为
    obj
    。只有在调用属性查找的结果时,才会出现
    魔术。。。即使仅仅使用
    [obj.method][0]()
    也与
    obj.method()
    不同,因为
    这个
    将是在方法代码执行期间查找属性
    0
    的数组

    这不是全部事实 这个回复只是想给你一个大致的描述,说明在Javascript中多少有些东西是如何工作的,当然这不是事实,但我认为这几点想法应该能够让你深入了解Javascript编程


    对于整个事实,你需要多读一点。

    构建一个JavaScript对象是如何实现的心智模型是重要的:如果你来自C++背景,那么考虑这个可能的模型

    javascript中的所有对象都属于同一类,即类“Object” 每个对象都定义为

    class Object {
        std::map<std::string, Object *> attributes;
    };
    
    然后执行

    var p = new Person("Andrea", "Griffini");
    alert(p.constructor === Person);
    
    将在消息框中显示“true”

    构造函数也是一个对象
    构造函数
    构造函数
    函数
    ,正如您可能猜到的那样,它也是一个对象,本身就是构造函数

    构造函数有一个名为
    prototype
    这个特殊属性允许继承和其他东西。Javascript遵循的规则很简单:当访问对象的属性
    attr
    x

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

    设置属性时,Javascript只是在实例中设置属性,而不是遵循
    构造函数.prototype