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);
}
var anObject=new myClass(arg1,arg2);
谢谢:)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
链