javascript的对象和变量之间的区分
我这里有这么一行代码:varrequest=createRequest();我可以吧request当作一个变量,由createRequest方法来赋值;我也可以把它当作一...
我这里有这么一行代码:
var request=createRequest();
我可以吧request当作一个变量,由createRequest方法来赋值;
我也可以把它当作一个object,于是request.xxx可以访问createRequest方法里面的xxx。
我这么说对吗?那么javascript的变量和对象是不是没有什么区别呢? 展开
var request=createRequest();
我可以吧request当作一个变量,由createRequest方法来赋值;
我也可以把它当作一个object,于是request.xxx可以访问createRequest方法里面的xxx。
我这么说对吗?那么javascript的变量和对象是不是没有什么区别呢? 展开
4个回答
展开全部
0, JavaScript的变量有几种类型: number, string, boolean, function, object, 对象就是变量的一种类型.
1,var request = createRequest();
我可以吧request当作一个变量,由createRequest方法来赋值;
这个说法有歧义, 不是由方法对变量赋值, 而是使用createRequest的返回值为变量赋值.
2, 我也可以把它当作一个object,于是request.xxx可以访问createRequest方法里面的xxx。
这个理解是错的, 从外部不能访问到方法内部定义的变量. 有一种特殊的情况:
function closure(){
var a = 1;
return function() {
return a++;
}
}
var fn = closure();
alert(fn()); //1;
alert(fn()); //2; 函数内部的变量被改变了
这个是JavaScript的闭包机制, 可以在方法外部修改方法的内部变更量. 类似于.Net的委托机制(Java的Callback); 并且这个内部变量的行为类似强制类型语言中的实例私有成员, 参考下面的代码:
//接上面的代码
var fn2 = closure();
alert(fn2()); //1, 创建了新的闭包
alert(fn()); //3, 原有闭包并未释放,
fn = null; //将对闭包内部变量的引用释放(将fn赋其它值也一样, fn = 1;), 则该闭包将会被gc回收
3, 对象, JavaScript对象一定是使用new关键字创建.
var a = {}; //简化写法等价于 var a = new Object();
var b = []; //简化写法等价于 var a = new Array();
4, 实例, javascript不是面向对象的语言, 但是对象有默认的constructor属性, 引用创建对象的function(可以理解为某类型的实例). 但是, 因为javascript是弱类型动态语言, 可以动态修改对象的结构或使用其它类型的引用为变量赋值, 所以并不能在语言层面确保对象的封装, 参考下面的代码:
function class(){
this.a = 1;
this.b = 'a';
}
function somethingElse() {
return 1;
}
//创建3个class的实例
var a = new class();
var b = new class();
var c = new class();
//此时 a.constructor === b.constructor === c.constructor === class;
a.constructor = somethingElse; //覆盖constructor属性, 这样a就和class没有任何关联了, 虽然有一个instanceof二元操作符, 但是其实现是比较prototype, 本例中都没有指定prototype(默认{}), 所以instanceof是无效的, a instanceof class == true, a instanceof somethingElse == true, a instanceof Object == true,
b = new somethingElse(); //这时b就变成somethingElse的实例了(b.constructor === somethingElse), 但是somethingElse方法没有为实例添加任何成员, 所以b = {};
delete c.b; //删除对象的成员, c = {a: 1}, 这样虽然c.constructor === class(还是class的实例), 但是与其它由class创建的实例外观就不同了.
1,var request = createRequest();
我可以吧request当作一个变量,由createRequest方法来赋值;
这个说法有歧义, 不是由方法对变量赋值, 而是使用createRequest的返回值为变量赋值.
2, 我也可以把它当作一个object,于是request.xxx可以访问createRequest方法里面的xxx。
这个理解是错的, 从外部不能访问到方法内部定义的变量. 有一种特殊的情况:
function closure(){
var a = 1;
return function() {
return a++;
}
}
var fn = closure();
alert(fn()); //1;
alert(fn()); //2; 函数内部的变量被改变了
这个是JavaScript的闭包机制, 可以在方法外部修改方法的内部变更量. 类似于.Net的委托机制(Java的Callback); 并且这个内部变量的行为类似强制类型语言中的实例私有成员, 参考下面的代码:
//接上面的代码
var fn2 = closure();
alert(fn2()); //1, 创建了新的闭包
alert(fn()); //3, 原有闭包并未释放,
fn = null; //将对闭包内部变量的引用释放(将fn赋其它值也一样, fn = 1;), 则该闭包将会被gc回收
3, 对象, JavaScript对象一定是使用new关键字创建.
var a = {}; //简化写法等价于 var a = new Object();
var b = []; //简化写法等价于 var a = new Array();
4, 实例, javascript不是面向对象的语言, 但是对象有默认的constructor属性, 引用创建对象的function(可以理解为某类型的实例). 但是, 因为javascript是弱类型动态语言, 可以动态修改对象的结构或使用其它类型的引用为变量赋值, 所以并不能在语言层面确保对象的封装, 参考下面的代码:
function class(){
this.a = 1;
this.b = 'a';
}
function somethingElse() {
return 1;
}
//创建3个class的实例
var a = new class();
var b = new class();
var c = new class();
//此时 a.constructor === b.constructor === c.constructor === class;
a.constructor = somethingElse; //覆盖constructor属性, 这样a就和class没有任何关联了, 虽然有一个instanceof二元操作符, 但是其实现是比较prototype, 本例中都没有指定prototype(默认{}), 所以instanceof是无效的, a instanceof class == true, a instanceof somethingElse == true, a instanceof Object == true,
b = new somethingElse(); //这时b就变成somethingElse的实例了(b.constructor === somethingElse), 但是somethingElse方法没有为实例添加任何成员, 所以b = {};
delete c.b; //删除对象的成员, c = {a: 1}, 这样虽然c.constructor === class(还是class的实例), 但是与其它由class创建的实例外观就不同了.
展开全部
当然有区别 只不过javaScript的变量不能自己定义类型所以所有类型的值都可以赋给同一个变量
你的例子
var request=createRequest();
如果这是一个普通的函数返回一个值的话request就是一个普通的变量
如果createRequest()是一个对象的构造方法的话那 request就是一个对象的引用
记住是引用而不是对象本身
这个时候你当然可以request.xxx可以访问createRequest方法里面的xxx
你的例子
var request=createRequest();
如果这是一个普通的函数返回一个值的话request就是一个普通的变量
如果createRequest()是一个对象的构造方法的话那 request就是一个对象的引用
记住是引用而不是对象本身
这个时候你当然可以request.xxx可以访问createRequest方法里面的xxx
追问
引用不是对象本身。。。嗯。。。问一下那个“实例”(instance)又是什么呢?request算是一个实例吗?
追答
还是这个var request=createRequest();
假设createRequest()是一个对象的构造方法 上边的语句就是创建了一个对象赋给了requset
这个时候 var sss=requset
这个时候sss和requset就是同一个实例的引用
比如这个对象里有一个int的值的话 你在requset里改变了那个值的话那sss的同一个值也会改变
明白了把
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
javascript 是动态脚本语言。
任何变量都有 .prototype属性
所有对象的属性都映射在.prototype下
这样就能动态给变量赋予属性。
所以使用起来是没有区别,只是内部实现不同
任何变量都有 .prototype属性
所有对象的属性都映射在.prototype下
这样就能动态给变量赋予属性。
所以使用起来是没有区别,只是内部实现不同
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这是不同的概念,变量可以是整数,浮点数,也可以是一个对象的引用。两者不能等同。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询