开发者社区> 问答> 正文

JavaScript语法问题,求解?报错

为什么下面这样的写法是错的?会报错,而要像Object.prototype.fuck这样写

Object.fuck = function() {
	return 111;
}

而下面这个不会报错

var obj = new Object();
obj.fuck = function() {
	return 111;
}

展开
收起
爱吃鱼的程序员 2020-06-20 16:47:29 562 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    两个都没有错,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,那你说的不是矛盾么?

    引用来自“Lightning_Strike”的评论

    两个都没有错,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();就会不报错*/



    2020-06-20 16:47:46
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
JavaScript异步编程 立即下载
Delivering Javascript to World 立即下载
编程语言如何演化-以JS的private为例 立即下载