`
kino
  • 浏览: 104650 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

用new创建自定义对象时的疑问

阅读更多

我昨天发现了js的一些奇怪问题,当用new操作符创建自己的对象时。不知有人知道原因吗?

1、我们可以用function创建构造函数,然后用new生成自己的对象。

function book(){
    this.tip="I'm a book";
}
var myBook = new book();

 

上面代码没什么疑问,会生成一个新的对象,myBook来引用它,这个对象有一个属性tip,值为"I'm a book"



2、当我们在构造函数中加入返回语句时

function book(){
    this.tip="I'm a book";
    return {};
}
var myBook = new book();
 

上面在构造函数的最后返回了一个空对象,这时的myBook就是一个空对象,不拥有任何属性。‘this.tip="I'm a book"’就像没起作用。



3、当我们返回的是一个字符串字面量时(数字也可以)

function book(){
    this.tip="I'm a book";
    return "I'm a string";
}
var myBook = new book();
 

按道理推测,这时的myBook就该引用的是字符串对象"I'm a string",但事实上是myBook和1中的一样,引用了一个对象,该对象有一个属性tip,值为"I'm a book",这时的return为什么没用了



4、当我们以另一种方式返回一个字符串时(数字一样)

function book(){
    this.tip="I'm a book";
    return new String("I'm a string");
}
var myBook = new book();
 

这时的myBook引用的就是字符串"I'm a string",这个和3中有什么不同?

所以,我想知道new操作符做了些什么,机制又是如何的?

  • test.rar (567 Bytes)
  • 描述: 测试文件
  • 下载次数: 5
分享到:
评论
3 楼 jimmyideal 2008-09-26  
字符串字面量应该就是直接反映内存中的值,它不是一个对象;
new String()产生的是内建的String对象的实例。
但是,为什么又有这种写法:"string a".charAt(i) ?
这是由于属性操作符(.)帮我们转换成String Object,ECMAScript Language Specification 11.2.1 Property Accessors :
引用

The production MemberExpression :  MemberExpression [ Expression  ] is evaluated as follows:

1. Evaluate MemberExpression.

2. Call GetValue(Result(1)).

3. Evaluate Expression.

4. Call GetValue(Result(3)).

5. Call ToObject(Result(2)).

6. Call ToString(Result(4)).

7. Return a value of type Reference whose base object is Result(5) and whose property name is Result(6).
2 楼 kino 2008-09-26  
谢谢楼上的解释。
我还有一个疑问就是字符串字面量和new出来的字符串有何区别?是不是不把字符串字面量当作对象看待?
1 楼 jimmyideal 2008-09-26  
来自ECMAScript Language Specification,构造函数的执行过程
引用

    When the [[Construct]] property for a Function object F is called, the following steps are taken:

    1. Create a new native ECMAScript object.

    2. Set the [[Class]] property of Result(1) to "Object".

    3. Get the value of the prototype property of F.

    4. If Result(3) is an object, set the [[Prototype]] property of Result(1) to Result(3).

    5. If Result(3) is not an object, set the [[Prototype]] property of Result(1) to the original Object prototype object as described in 15.2.3.1.

    6. Invoke the [[Call]] property of F, providing Result(1) as the this value and providing the argument list passed into [[Construct]] as the argument values.

    7. If Type(Result(6)) is Object then return Result(6).

    8. Return Result(1).

构造函数执行过程会创建一个对象。如果函数有返回值且为对象,则做为new操作符的结果返回;否则返回新创建的对象。3,4的区别在于,4返回String对象。

相关推荐

    openlayers案例demo(详细注释)

    使用`ol.style`模块可以创建自定义的图层样式,包括图标、填充色、描边等。例如: ```javascript var style = new ol.style.Style({ fill: new ol.style.Fill({ color: 'rgba(255, 255, 255, 0.6)' }), ...

    Java动态代理案例演示代码

    Java动态代理是Java语言提供的一种强大的机制,它允许在运行时创建具有特定接口的代理类对象,这些代理类对象能够对方法调用进行拦截和增强。动态代理在很多场景下非常有用,例如AOP(面向切面编程)、事件监听、...

    Java初学者都应该搞懂的六个问题.pdf

    因此,频繁地修改字符串应避免使用String,转而使用可变的`StringBuffer`或`StringBuilder`类,它们在修改时不会创建新对象,从而提高性能。 第四个问题涉及到**数组和集合的区别**。在Java中,数组是一组相同类型...

    java webService XML document String

    2. **Pull生成XML和解析XML**:Pull解析器是一种轻量级的API,它允许开发者按需读取XML,不需要处理事件或创建自定义处理器。生成XML时,开发者可以通过调用方法来构建XML结构。 生成XML示例: ```java ...

    vb.net 绘图

    同时,为了实现更复杂的图形,可以利用多边形和曲线的组合,或者使用Path对象来绘制自定义形状。 "VBNET_CAD-2"可能是相关代码示例或教程的文件名,打开这个文件将能进一步了解如何在VB.NET环境中实现CAD图形的完整...

    BitmapPixels示例中AGRB_8888疑问

    Bitmap对象在内存中存储图像数据时,有多种不同的格式,每种格式定义了像素数据的排列方式。其中,ARGB_8888是最常见的一种,它代表每个像素由4个8位(1字节)的通道组成:Alpha(透明度)、Red、Green和Blue。这四...

    C#API设定纸张源码

    你可以通过`new PrinterSettings()` 创建一个实例,并使用`PrinterSettings.DefaultPageSettings` 来获取或设置打印机的默认页面设置。 2. **PageSettings** 类:此类包含了关于页面布局的具体信息,如纸张大小(A4...

    POI3.5_HSSF_和XSSF_Excel操作快速入门手册.pdf

    // 创建绘图对象 Drawing drawing = sheet.createDrawingPatriarch(); // 插入图片 Picture pict = drawing.createPicture(anchor, wb.addPicture(...)); ``` #### 六、结语 本文档仅提供了 POI3.5 HSSF 和 XSSF ...

    xib的简单使用

    理解这些结构有助于更深入地使用Xib,比如自定义Xib的加载逻辑。 7. **加载与使用Xib** 在代码中,你可以使用`NSBundle`和`UINib`加载Xib文件,然后实例化其中的对象。这通常在控制器中完成,以便在运行时动态加载...

    C#窗体渐变

    1. **创建自定义窗体类**:首先,你需要创建一个继承自`System.Windows.Forms.Form`的自定义窗体类,以便可以覆盖或扩展其默认行为。 ```csharp public class GradualForm : Form { // ... } ``` 2. **绘制渐变...

    FusionCharts v3图表 例题

    在创建图表时,你需要先准备数据,这可以是静态XML文件、动态服务器端脚本(如PHP、ASP.NET或Java)生成的XML,或者直接用JSON对象。 1. **安装与引入**:在你的项目中引入FusionCharts库,通常通过下载并链接到...

    百度地图覆盖物和我的位置显示

    2. 初始化地图:使用`BMap.Map`类创建地图实例,并设置地图的中心点坐标和缩放级别。 3. 添加覆盖物:通过`BMap.Marker`、`BMap.Polyline`、`BMap.Polygon`等类创建不同类型的覆盖物,然后将其添加到地图上。 例如...

    MySpinnerDemo

    - 如何在Spinner中使用自定义的数据模型,例如,如果数据不是简单的字符串,而是复杂的对象。 - 如何在Spinner中添加默认选中项。 - 如何在Spinner中处理空值的情况。 - 如果涉及网络数据,可能还会介绍如何异步加载...

    asp.net C# xml常用操作方法

    5. **XML序列化与反序列化**:ASP.NET C#提供了一种将对象转换为XML字符串或将XML字符串还原为对象的方法。`XmlSerializer`类是实现这一功能的关键。序列化: ```csharp public class MyClass { ... } MyClass obj =...

    C++Primer源程序

    2. **类与对象**:C++的核心是面向对象编程,源程序将展示如何定义类、创建对象、成员函数的使用以及封装、继承和多态等概念。 3. **构造函数与析构函数**:这些特殊成员函数用于对象的初始化和清理,源码中会体现...

    大名鼎鼎SWFUpload- Flash+JS 上传

     swfu = new SWFUpload({  upload_url : "http://www.swfupload.org/upload.php",  flash_url : "http://www.swfupload.org/swfupload_f9.swf", file_size_limit : "20480"  });  };  以下是一个标准的...

    MyEclipse(Java)连接SQLServer 2008 R2 失败n次的经验.pdf

    在使用MyEclipse进行Java开发时,与SQLServer 2008 R2数据库的连接是一个常见的需求。本文主要介绍了一位开发者在经历多次失败后,成功连接SQLServer 2008 R2的过程。 首先,确保SQLServer 2008 R2已经成功安装并...

    邮件发送 C# 源码 vs2008

    用来创建邮件对象,包括收件人、抄送人、密送人、主题、正文等。例如: ```csharp MailMessage mail = new MailMessage(); mail.From = new MailAddress("from@example.com"); mail.To.Add("to@example.com"); ...

    2015-OpenLayers-3-入门教程详细版_openlayers_

    1. **初始化地图**: 创建一个HTML元素作为地图容器,然后通过`new ol.Map()`实例化地图对象,指定地图容器、图层和视图。 2. **添加图层**: 可以使用`ol.layer.Tile`或`ol.layer.Image`为地图添加瓦片图层,或者用`...

Global site tag (gtag.js) - Google Analytics