2 stophin stophin 于 2016.04.17 22:38 提问

Javascript中类的new和类返回this的问题

使用Javascript创建两个类
function RectF(x, y, w, h) {
this.X = x;
this.Y = y;
this.Width = w;
this.Height = h;
...
}
function PointF(x, y) {
this.X = x;
this.Y =y;
}
使用时我想像C语言那样传参数进去:
int ret = isin(RectF(10,10,10,10), PointF(2,19));
结果不敢想像!为什么?因为上面使用的只是多重函数嵌套调用,根本没有类!然而这两个function没有返回值,
传给isin的两个参数都是undefined!
应该这样调用int ret = isin(new RectF(10,10,10,10), new PointF(2,19));
不过我试着在两个类的最后添加上reurn this;结果就正确了!
所以问题来了:使用return this返回的究竟是什么?难道返回this和加new是一样的效果吗?那么返回this会对内存有分配吗?

5个回答

hsd2012
hsd2012   2016.04.18 08:20
已采纳

function PointF(x, y) {
this.X = x;
this.Y =y;
}
如果直接调用即var p= PointF(x, y) ;此时函数中this,代表全局变量对象,也就是window,其中,x、y为全局变量,你可以通过window.x访问x。也可以直接输出x、y。
如果通过var p=new PointF(x, y) ;此时函数中this,代表的是构造函数PointF创建的对象,其中x,y为局部变量。
如果你想通过var p= PointF(x, y) ;调用,并且创建一个新的对象。你可以改写PointF函数如下
function PointF(x,y){
var o=new Object();
o.x=x;
o.y=y;
return o;
}
关于JS对象创建,详细信息,你可以参考http://blog.csdn.net/hsd2012/article/details/50978425这个。

showbo
showbo   Ds   Rxr 2016.04.18 08:57

int ret = isin(new RectF(10,10,10,10), new PointF(2,19));

这样写不需要再RectF中return this,直接就是RectF的实例了,默认就会return this,没有new则是调用函数,如果没有return语句,那么默认就是return undefined

caozhy
caozhy   Ds   Rxr 2016.04.17 23:11
qq970973742
qq970973742   2016.04.18 08:29

this是指向調用此函數的運行環境的對象(與引用差別很大).new 是通過構造函數方法創建一個類似與創建類對象的數據對象.既然產生新的對象,并產生對對象引用的值傳遞,肯定會涉及分配內存.至於上面所說的prototype,其實正確的是和普通構造函數一起搭配使用才是正確的模式.不過其也具備很大限制條件

CSDNXIAOD
CSDNXIAOD   2016.04.17 22:42

javascript中的this问题
javascript对象中this问题
Java 类.this含义与.new
----------------------biu~biu~biu~~~在下问答机器人小D,这是我依靠自己的聪明才智给出的答案,如果不正确,你来咬我啊!

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
es6 javascript的class类的new的新特性
new是从构造函数生成实例的命令。 ES6 为new命令引入了一个new.target属性,( 在构造函数中) 返回new命令作用于的那个构造函数。 如果构造函数不是通过new命令调用的, new.target会返回undefined, 因此这个属性可以用来确定构造函数是怎么调用的。function Person(name) { if(new.target !== undefined) { ...
findTask,queryTask,indentifyTask 之间的区别
1:QueryTask是一个进行空间和属性查询的功能类,它可以在某个地图服务的某个子图层内进行查询,顺便需要提一下的是,QueryTask进行查询的地图服务并不必项加载到Map中进行显示。QueryTask的执行需要两个先决条件:一个是需要查询的图层URL、一个是进行查询的过滤条件。        查询一个图层里面的数据:链接如http://10.188.180.124:8399/arcgi
JavaScript 类的四种定义方法
类的四种定义方法// 工厂模式function Car(name, color, price) { var tempcar = new Object; tempcar.name = name; tempcar.color = color; tempcar.price = price; tempcar.getCarInfo = function () { console.log(`name: ${...
JavaScript类的写法
一.js类的基本含义 我们知道,在js中,是没有类的概念的。类的所有实例对象都从同一个原型对象上继承属性,因此,原型对象是类的核心。 类是对象的抽象,而对象是类的具体实例。类是抽象的,不占用内存,而对象是具体的,占用存储空间。———百度百科 早期的javascript需求都很简单,基本都是写成函数的,然后是面向过程的写法,后来慢慢的引入面向对象开发思想,再后来就慢慢写成 类。 在js中,写
requirejs定义的模块返回的永远是单例对象,可以借助javascript中的类解决模块间的相互干扰问题
RequireJS中定义一个模块,总的来说有2种方式:简单键值对和函数依赖式。 1.简单键值对:一个模块仅含有值对,没有任何依赖 define({ color: "black", size: 1, method1: function() {}, method2: function() {} }); 这种写法虽然简单,但是有很大的局限性,仅仅是定义了该模块的
JavaScript中的类与对象的本质
在JavaScript中,函数(function)就是对象。注意:这里的function是小写字母开头。   在JavaScript中,有一个Function对象,所有自定义的函数都是Function对象类型的。 Function对象接收的所有参数都是字符串类型的。 其中最后一个参数就是要执行的函数体,而前面的参数则是函数真正需要接收的参数。 下面就上面两条举个例子: 1 、 //f
JS常见的六类错误类型
摘自:http://www.leixuesong.cn/2825最近打算花点时间好好学习一下Javascript。之前一直知道JS怎么用,可就是不理解JS的本质。发现一些JS框架的源代码还是不太理解,想去了解详细的学习一下Javascript。下面PHP程序员雷雪松详细的总结下Javascript中常见的六类错误类型。一、SyntaxError解析错误 SyntaxError是解析代码时发生的语法
JavaScript 的新特性:类的 #private 字段
这是什么,如何使用,为什么需要? 一边听“Noise Pollution” —— Portugal. The Man,一边阅读本文简直就是享受 JavaScript 标准的第二阶段(Stage 2)加入了类私有字段。它还没有最终确定,但 JavaScript 标准委员会认为这个特性会被开发出来并最终纳入标准(虽然它可能还会改变) 它的语法(当前)看起来像这样: 1 c
c++ 返回值为 类的对象 http://blog.csdn.net/zyearn/article/details/9709041
C++中用函数返回值初始类对象时的一个问题 分类: C/C++2013-08-01 23:32 1635人阅读 评论(1) 收藏 举报 问题: 有一个类,名字是C,假设有一个函数,它的定义为: [cpp] view plaincopy C func()   {        C tmp;        return tmp
JavaScript 中的"类"与"实例"
JavaScript 中没有父类, 子类的概念, 也没有class 和 instance 的概念, 全靠 prototype chain来实现继承. 当查找一个对象的属性时, JavaScript 会向上遍历 prototype chain, 直到找到对应的属性为止. 有几种方法, 可以使得 JavaScript 模拟出 class 和 instance 的概念.