扫码关注官方订阅号
alert($.name);出错alert($.type());正常
请教如何使$.name正常
name:(function(){ return this.str; })() 更改为 name:this.str 还是不行。。。
name:(function(){ return this.str; })()
name:this.str
认证高级PHP讲师
<script> (function(){ function _$(){ this.str = 200; } _$.prototype = { name:(function(){ return this.str; })(), type:function(){ return this.str; }, } window.$ = new _$(); })(); console.log($.name);//在定义赋值的时候name就被赋值为undefined,因为this为全局对象,其下没有str属性被定义 console.log($.type());//this为new _$()出的实力对象,有str属性,其值为200; </script>
this只存在于函数体中,在函数被调用时其才有意义。
this
下面利用 Object.defineProperty方法及set/get属性描述器,可以实现你的需要不知你要这样写代码的目的是什么
(function(){ function _$(){ this.str = 200; this.ddd="789"; } _$.prototype = { type:function(){ return this.str; } }; Object.defineProperty(_$.prototype, 'name', { get: function() { return this.str; }, set: function(newValue) { this.str = newValue; } }); window.$ = new _$(); })(); console.log($.name); console.log($.type());
楼上说的没错。 其实这里更确切的应该叫做IIFE(立即执行函数). 使用IIFE的时候里面的this都是执行window或者说是全局的global对象。 详情理解可以参考一下,js引擎解析js代码的过程。因为解析器会会首先解析函数,变量名。 如果你是IIFE他不会管你在那一层定义的。他会首先提取出来,在全局中执行。 所以你这样使用,执行的结果肯定是undefined的。另外,你的第二种方法:
function _$(){ this.str = 200; } _$.prototype = { name:this.str, type:function(){ return this.str; }, } var $ = new _$(); console.log($.name);
区分的点其实应该是this的指向问题,这里this指向的是_$.prototype。 而你在该原型链上并没有定义name,所以也是undefined
楼上的答案都很对。1.自执行的匿名函数关键字this是指向window对象,所以在原型方面中是做不到首先确定this指向一个示例对象2.如果想在构造函数时机来确定原型对象的静态属性,那么直接在构造函数中写就可以了
window
(function(){ function _$(){ this.str = 200; _$.prototype.name = 200; } _$.prototype = { type:function(){ return this.str; }, } window.$ = new _$(); })(); console.log($.name); console.log($.type());
匿名函数this指向window。
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
this只存在于函数体中,在函数被调用时其才有意义。下面利用 Object.defineProperty方法及set/get属性描述器,可以实现你的需要
不知你要这样写代码的目的是什么
楼上说的没错。 其实这里更确切的应该叫做IIFE(立即执行函数). 使用IIFE的时候里面的this都是执行window或者说是全局的global对象。 详情理解可以参考一下,js引擎解析js代码的过程。因为解析器会会首先解析函数,变量名。 如果你是IIFE他不会管你在那一层定义的。他会首先提取出来,在全局中执行。
所以你这样使用,执行的结果肯定是undefined的。
另外,你的第二种方法:
区分的点其实应该是this的指向问题,这里this指向的是_$.prototype。 而你在该原型链上并没有定义name,所以也是undefined
楼上的答案都很对。
1.自执行的匿名函数关键字
this是指向window对象,所以在原型方面中是做不到首先确定this指向一个示例对象2.如果想在构造函数时机来确定原型对象的静态属性,那么直接在构造函数中写就可以了
匿名函数this指向window。