首先跳转到代码:
function myClass(arg1,arg2){
this.arg1=arg1;
this.arg2=arg2;
}
myClass.prototype.sayArg=function(){
console.log("First Arg is "+ arg1);
}
为什么我必须添加'prototype'来为类声明一个函数?即使它会延长,默认情况下每个孩子都不会得到这种方法吗?实际上是什么,我从开始就把“阶级”和“原型”搞得一团糟。我读了link,还不明白:(
如果我使用该文学(或只是'= new Object()')方法定义我的类,我如何在以后定义构造函数,以便我可以使用
var anObject=new myClass(arg1,arg2);
如果你注意到,我没有在第6行使用'this.arg',这是一个错误,这让我怀疑。我已经指定了'myClass'。意味着它属于myClass,仍然无法访问其'arg1'成员?为什么我要用'这个'。在同一课堂上接听它?这是私人会员吗?但是由于函数属于同一个类,它应该可以访问它(在c ++中的类型)。
谢谢:)
答案 0 :(得分:4)
建立一个如何实现Javascript对象的心智模型非常重要:如果您来自C ++背景,那么请考虑这个可能的模型
每个对象都定义为
class Object {
std::map<std::string, Object *> attributes;
};
这意味着例如
属性集不固定,您可以在运行时将属性添加到特定对象实例
继承并不像在C ++中那样工作
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
时
x
本身具有请求的属性,则返回值x
会查找x.constructor.prototype
而不是attr
第二步也是递归的,这意味着如果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
值将为this
。 obj
魔法仅在您调用属性查找结果时才会发生...即使仅使用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介绍。这不是一个很大的阅读,不会花很长时间,应该帮助回答你的所有问题。