javascript new构造器与对象详解

首先我们拆解为如下代码
JScript code

 代码如下 复制代码
var str = function(){
                return 'Hello world';
            }
            alert(new str());
            var str1 = function() {
                return new String('hello world');
            }
            alert(new str1())

           

这个代码和你之前的代码是一个意思,能理解吧。
好我们来实验下。
JScript code

 代码如下 复制代码
var str = function(){
                return 'Hello world';
            }
            alert(str);
            var str1 = function() {
                return new String('hello world');
            }
            alert(str1)

这个打印出来的结果大家也都是意料之中吧。也是显而易见的,不多解释了。
JScript code           

 代码如下 复制代码
var str = function(){
                return 'Hello world';
            }
            alert(str());
            var str1 = function() {
                return new String('hello world');
            }
            alert(str1())

那么,顺着意思走到这里,得到的结果也无可厚非了。但是为什么,函数作为构造器得到的结果不一样呢。
JScript code

 代码如下 复制代码

            function str() {
                return 'Hello world';
            }

            function str1() {
                return new String('hello world');
            }
            alert(new str());
            alert(new str1());

针对这样的问题,我们需要了解2样东西
1、new()干了神马事
很多童鞋都知道,new function()的时候,会返回this指针对象作为对象引用。但是如上面DEMO里没有this,而是直接return一个值呢。

我们看一个新的例子
JScript code           

 代码如下 复制代码
var test = 'hello world';
            var test1 = new String('hello world');
           
            function testStr(){
                return test;
            }
            function testStr1() {
                return test1;
            }
           
            alert(new testStr() == test);//outputs:false
            alert(new testStr1() == test1);output:true

呀,是不是有点感觉了,但是却又还是搞不清为什么是这样?别急,我们继续看
JScript code           

 代码如下 复制代码

alert(test instanceof String);
            alert(test1 instanceof String);

根据上面的例子,我们看到test不是instanceof String的。那么用typeof也可以看到test的TYPEOF是string。由此我们延伸出一个问题,字面量对象和构造器对象有什么区别么?回答:原型!!!!。
好了,我们在解决了第二个问题,由此可以推回我刚才说的第一个问题,new()做了什么,其实new 做了件我们需要知道的事。就是维护了原型链。
最后我做一个假设。因为我现在并不能确定我说的是否是对的。
JScript code

 代码如下 复制代码
function func() {
}
               var test = new func();
            /* new的过程中做了如下的行为
             var returnVal = new Object();
             returnVal.prototype = this;//其中这一步未必如此,我们可以理解为复制阶段
             if(returnVal is object) {  //这个is是instanceof更贴切,或者就是说原型链中能找到继承自object
                return returnVal;
            } else
                return obj;
            */
时间: 2024-09-22 21:50:08

javascript new构造器与对象详解的相关文章

Javascript之BOM(window对象)详解_基础知识

ECMAScript是JavaScript的核心,但在web使用JavaScript,那么BOM(浏览器对象模型)才是真正的核心. BOM的核心对象是window,它表示浏览器的一个实例. 在浏览器中,window对象既是JavaScript访问浏览器窗口的一个接口,又是ECMAScript规定的Global对象.也就是说,在网页中定义的任何一个变量.对象和函数以window作为其Global对象. 1.全局作用域 既然window对象扮演着Global对象,那么所有在全局作用域中声明的对象.变

JavaScript字符串处理(String对象)详解_基础知识

定义字符串(String)对象 JavaScript String 对象用于处理文本字符串.创建 String 对象语法如下: 复制代码 代码如下: <script language="JavaScript"> var str_object = new String( str ); var str1 = String( str ); var str2 = str; </script> 以上三种方法中,只有第一种是使用 String 构造函数严格的定义一个字符串对

javascript之Array 数组对象详解_基础知识

1.创建Array对象方法: --->var arr = [element0, element1, ..., elementn];//简单的定义方法 复制代码 代码如下: var arr = [1,2,3] 此时可以知道 复制代码 代码如下: arr[0] == 1; arr[1] == 2; arr[2] == 3; --->new Array(); 复制代码 代码如下: var arr = new Array();//定义一个没有任何内容的数组对象,然后以下面的方式为其赋值 arr[0]

JavaScript中的Reflect对象详解(ES6新特性)_javascript技巧

Reflect介绍: Reflect这个对象在我的node(v4.4.3)中还没有实现, babel(6.7.7)也没有实现 ,新版本的chrome是支持的, ff比较早就支持Proxy和Reflect了,要让node支持Reflect可以安装harmony-reflect ; Reflect不是构造函数, 要使用的时候直接通过Reflect.method()调用, Reflect有的方法和Proxy差不多, 而且多数Reflect方法原生的Object已经重新实现了. 什么要使用Reflect

javascript的变量 数组 对象详解用法(1/2)

* 1, 变量类型: JavaScript 是弱类型, 变量可存储任意类型, 并且运行期间类型可变; -> 变量可进行类型转换; */ /* 2, 变量声明: */ var i; var index; var i, index; var i = 0, index = 2; /* 变量声明, 无初始值时, 值为 undefined; 并且 var 声明的变量, 不能使用 delete 操作符删除; 重复声明为产生覆盖, 不会造成错误; 遗漏声明, 则会把变量隐式声明此变量, 并做为全局变量; (下

JavaScript的document对象详解

javascript|对象|详解 1.对象属性document.title //设置文档标题等价于HTML的<title>标签document.bgColor //设置页面背景色document.fgColor //设置前景色(文本颜色)document.linkColor //未点击过的链接颜色document.alinkColor //激活链接(焦点在此链接上)的颜色document.vlinkColor //已点击过的链接颜色document.URL //设置URL属性从而在同一窗口打开

JavaScript的document和window对象详解

javascript|window|对象|详解 [document对象] 该对象是window和frames对象的一个属性,是显示于窗口或框架内的一个文档. 属性 alinkColor 活动链接的颜色(ALINK) anchor 一个HTMI锚点,使用<A NAME=>标记创建(该属性本身也是一个对象) anchors array 列出文档锚点对象的数组(<A NAME=>)(该属性本身也是一个对象) bgColor 文档的背景颜色(BGCOLOR) cookie 存储于cooki

JavaScript——DOM操作——Window.document对象详解_javascript技巧

一.找到元素:     docunment.getElementById("id"):根据id找,最多找一个:     var a =docunment.getElementById("id");将找到的元素放在变量中:     docunment.getElementsByName("name"):根据name找,找出来的是数组:     docunment.getElementsByTagName("name"):根据标签

JavaScript Array对象详解_javascript技巧

本文介绍了Js的Array 数组对象,具体内容如下 目录1. 介绍:介绍 Array 数组对象的说明.定义方式以及属性. 2. 实例方法:介绍 Array 对象的实例方法:concat.every.filter.forEach.indexOf.join.lastIndexOf.map.pop.push.reverse.shift.slice.sort.splice.toString.tounshift等. 3. 静态方法:介绍 Array 对象的静态方法:Array.isArray(). 4.