zoukankan      html  css  js  c++  java
  • JavaScript学习笔记–(new关键字)

    作用

    是创建一个对象实例。这个对象可以是用户自定义的,也可以是一些系统自带的带构造函数的对象。

    描述

    创建一个对象类型需要创建一个指定了名称和属性的函数;其中这些属性可以指向它本身,也可以指向其他对象,看下面的例子:

    当代码 new hFive(…) 执行时:

    一个新对象被创建。它继承自hFive.prototype.
    构造函数 hFive() 被执行。执行的时候,相应的传参会被传入,同时上下文 this 会被指定为这个新实例。new hFive等同于 new hFive(), 只能用在不传递任何参数的情况。
    如果构造函数返回了一个“对象”,那么这个对象会取代整个new出来的结果。如果构造函数没有返回对象,那么new出来的结果为步骤1创建的对象,ps:一般情况下构造函数不返回任何值,不过用户如果想覆盖这个返回值,可以自己选择返回一个普通对象来覆盖。当然,返回数组也会覆盖,因为数组也是对象。
    任何情况下都可以对任意一个对象添加新的属性,比如 hFive.color = “black” 这句代码给hFive添加了一个新的属性color , 然后给这个属性赋值 “black”。然而,这个操作不会影响任何其他对象。

    如果想给所有同样类型的对象添加属性,你需要给hFive这个对象类型来添加属性。你可以通过给 hFive.prototype 添加属性的方式来给所有先前定义的实例来添加属性。这种定义属性的方式会影响到所有通过new构造函数创建的对象,因为它们共享了这个对象类型。

    举例

    (以函数hFive为例说明)

    1.通过” . “的方式给hFive添加的方法或属性,使用new关键字实例的对象不会继承,但是hFive本身可以使用。

    var hFive=function(){
    	this.name="默@语";
    	this.url="h-five.com";
    	this.says=function(){
    		alert("hello guys! here is MoYu. Welcome to herer");
    	}
    }
    
    hFive.other=function(){
    	alert("是通过' . '添加的方法。");
    }
    
    var c=new hFive();
    c.says();//hello guys! here is MoYu. Welcome to herer.
    hFive.other();//是通过' . '添加的方法。
    c.other();//c.others is not a function
    

    2.通过原型链prototype添加的方法,使用new关键字实例的对象会继承,hFive自己不能使用。

    var hFive=function(){
    	this.name="默@语";
    	this.url="h-five.com";
    	this.says=function(){
    		alert("hello guys! here is MoYu. Welcome to herer");
    	}
    }
    
    hFive.prototype.other=function(){
    	alert("是通过' . '添加的方法。");
    }
    
    var c=new hFive();
    c.says();//hello guys! here is MoYu. Welcome to herer.
    c.other();//是通过' . '添加的方法。
    hFive.other();//hFive.other is not a function
    

    瞎扯淡

    直接使用hFive获取hFive内部的属性或者方法会出错,提示undefined或者hFive.says is not a function。因为此时hFive只是被赋值为一个函数(相当于只是声明了一样),并没有执行,所以会有上面的提示,当执行hFive()后,在直接使用hFive直接使用hFive获取hFive内部的属性或者方法同样会出错,因为此时hFive()执行的上下文是window,所以内部的this指代的是全局对象window,使用window.url或window.says()则不会报错;

    东拉西扯

    1.下面代码中f能否调用a()和b()方法

    var F = function(){};
    Object.prototype.a = function(){ console.log("O");};
    Function.prototype.b = function(){console.log("F");};
    var f = new F();
    f.a();//0
    f.b();//f.b is not a function
    console.log(f instanceof Function);//false
    console.log( typeof f);//true
    F.b();//F
    

    f只能调用a方法,不能调用b方法,因为通过new关键字创建的是一个对象实例 ,他是一个对象,所以它能继承Object.prototype,也就能使用a放法。通过Function.prototyp添加的方法能被所有的Function对象使用,所以f不能调用b方法,但是F能调用b方法,因为它是一个function对象,function对象继承Function.prototype,是Function的一个实例,所以它也是Function对象,也就能使用b方法。

    2.下面代码,a的值是多少,b的只是多少。

    var a = {n: 1};
    var b = a;
    a.x=a = {n: 2};
    console.log(b.x);//Object {n: 2}	
    console.log(b);//Object {n: 1, x: Object}
    console.log(a);//Object {n: 2}
    console.log(a.x);//undefined
    

    当代码执行到 a.x=a = {n: 2}; 时,赋值运算符会从右向左赋值,首先a = {n: 2},javascript会创建一个新的对象,并用a指向它,a原来的值被覆盖,执行完之后执行a.x=a,但此时a.x的a并不是=后面的a,a.x的a是以前的a,也就是b(因为之前a被复制给了b),所以最后结果如上所示。

    参考文档

    https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/new

    https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Function

    原创,转载请注明来源,默@语:www.h-five.com
  • 相关阅读:
    调试windows service的OnStart事件.
    Windows 7 下 ORACLE10G安装方法
    汉字编码对照表(gb2312/Big5/GB2312)
    FastReport For Delphi7 通用安装方法
    Visual Studio 2008 不能更改安装目录的原因
    全国信息技术标准化技术委员会汉字内码扩展规范(GBK)
    字符编码详解及由来(UNICODE,UTF8,GBK)[转帖]
    淘宝收藏
    蛙蛙推荐:设计一个Tracing组件
    收藏:SYN 攻击原理以及防范技术
  • 原文地址:https://www.cnblogs.com/hlere/p/5218216.html
Copyright © 2011-2022 走看看