为什么下面这样的写法是错的?会报错,而要像Object.prototype.fuck这样写
Object.fuck = function() { return 111; }
而下面这个不会报错
var obj = new Object(); obj.fuck = function() { return 111; }
两个都没有错,Class.<function_name>=function(){}这种方式,一般拿来写一些类的静态方法。比如像Java里边的String.format()就可以用String.format=function(str){returnstr}这种方式实现。
Class.prototype.<function_name>=function(){//whatever}这种方法是扩展对象的方法,这里的function可以访问实例(instance)的this变量。
要访问这个函数必须new下。用实例来访问
classInstance.<function_name>=function(){}这种方式是动态附加一个函数在这个实例(instance)上,没有什么实际作用,个人认为。
一般classInstance.<property>这种方式会用的比较多,动态添加变量的属性。
--------------
由于这部分比较侧重于OOP(面向对象)的js写法,所以在这个语境下我用Class来代替Fuction描述。
回复 @wnow20:能解决问题,解答疑问就好,是不是最佳答案不是重点回复 @mr-zhuo:嗯嗯,是的,不过现在又多了个问题Object.prototype.fn为什么能被静态调用,而PrivateClass.prototype.fn不能静态调用PrivateClass.fn();//error回复 @mr-zhuo:能这样理解么,如下:只有Object.prototype.fn定义的原型变量的函数,任何类都可以静态调用?回复 @wnow20:应该这样理解Object是整个js所有类型的基类,包括它自己在Object.prototype下定义的所有方法和属性,都会被继承varx=1;x.fn();//一样能调用,因为x是Number类型,Number继承了Object.prototype的方法回复 @mr-zhuo:回复 @mr-zhuo:我这里测试可以的,代码具体如下:"usestrict"Object.prototype.fuck=function(){return111;}console.log(Object.fuck()); WhatisObject你是想为object定义一个f**k属性,而object你并没有定义。js也不会为你默认去创建一个对象。
varobject={}; //这里定义一个空的对象
object.fuck=xxxx //为该对象添加一个属性
你好像没有说清楚两者的区别。规则就是规则,没有为什么嗯嗯,你说的很对,可是我想知道具体是哪个语法,这样我才能查资料学习。你知道是什么语法么?上面那个在什么浏览器上会报错?没报错啊googlechrome,其它的我没试过,估计是语法不懂就别回答,误人子弟。
前端正因为不懂却还非要插一脚的人太多,搞得别人都不信任这个职位了。
楼主也不要问这些问题,没什么高手来答的,只会引来搅屎棍。
这本书不错,http://book.douban.com/subject/10546125/,不打算一辈子不懂,就把它啃完。
回复 @wnow20:权威指南跟api说明没啥不一样。如果你懂基本语法。果断高级程序设计。。经典书目。。2本都很好,一本叫宝典,一本叫经典回复 @铂金小江:嗯嗯。是的额,哦,谢谢,我刚正在看《JavaScript权威指南》,两本书哪本好呀?回复 @wnow20:都看完,自然会知道哪个好。靠自己。语法肯定是错误的,Object是js里的对象,你这样引用当然不对了回复 @mr-zhuo:是的,没错这个语法应该没错吧Object是JavaScript里的一个function,我们一般叫它构造函数。
typeofObject==="function"//true虽然『在JavaScript里一切都是对象』,但是对函数使用『.』操作符将不会产生任何效果。
functionA(){};A.b=1;//undefinedconsole.log(A);//functionA(){}通过new操作符调用构造函数,就能产生一个新的对象。
functionA(){};vara=newA();//a是一个对象,A是构造函数这时再通过『.』操作符给对象a增加属性就和普通的对象操作无异了。
A.b=1;//成立的,而且也是有效的你说Object是function,那你说的不是矛盾么?两个都没有错,Class.<function_name>=function(){}这种方式,一般拿来写一些类的静态方法。比如像Java里边的String.format()就可以用String.format=function(str){returnstr}这种方式实现。
Class.prototype.<function_name>=function(){//whatever}这种方法是扩展对象的方法,这里的function可以访问实例(instance)的this变量。
要访问这个函数必须new下。用实例来访问
classInstance.<function_name>=function(){}这种方式是动态附加一个函数在这个实例(instance)上,没有什么实际作用,个人认为。
一般classInstance.<property>这种方式会用的比较多,动态添加变量的属性。
--------------
由于这部分比较侧重于OOP(面向对象)的js写法,所以在这个语境下我用Class来代替Fuction描述。
functionClass(){};Class.prototype.fn=function(){/*code*/}Class.fn();//error直接输这一段代码,不输上面那一段,应该是报错的是的,Class.fn()调用的还是Object.prototype.fn这里定义的函数 Object.prototype.fn=function(){return"thisisObject'sfunction";}functionClass(){}Class.prototype.fnx=function(){return"thisisClass'sfunction";}vartest=newClass();test.fny=function(){return"thisistest'sfunction";};test.fny();//直接运行test.fny方法test.fnx();//先查找test有没有fnx属性,有直接执行,没有就找test的构造函数Class.prototype有没有这个fnx,有就执行Class.prototype.fnx();test.fn();//先查找test有没有fn属性,有直接执行,没有就找test的构造函数Class.prototype有没有fn,还是没有,继续找Object.prototype.fn,然后执行,如果Object.prototype.fn还是没有,报错/*PrivateClass.prototype.fn不能静态调用PrivateClass.fn()因为调用PrivateClass.fn的时候,先判断PrivateClass有没有fn方法,没有就找Object.prototype有没有fn方法如果是varx=newPrivateClass();x.fn就会先看PrivateClass.prototype.fn存不存在所以x.fn();就会不报错*/版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。