那些你可能不知道的JavaScript

那些你可能不知道的JavaScript

JavaScript语音涉及到的内容是非常非常多的,首先我们来谈谈创建对象常用的几种方式

方式一:通过对象字面量表示法(又称为直接量、原始方式)

var  obj={name:"xyz123"}

对象字面量是一个名/值对列表,每个名/值对之间用逗号分隔,名和值之间用冒号分隔,最后整体用一个花括号括起来。属性名可以使用数值,数值属性名会自动转换为字符串。
在ES5中,对象直接量中的最后一个属性后的逗号可以省略,且在ES3的大部分实现中也可以忽略这个逗号,但在IE中则报错。使用对象字面量语法时,如果留空其花括号,则可以定义只包含默认属性和方法的空对象

var obj={}

对象字面量也可以先创建,再添加属性和方法。

var obj={}
obj.name="xyz123";
obj.age=18;

方式二:用自定义构造函数来初始化新对象。

function Fun(){
	this.name="xyz123";
	this.age=18;
}
var f=new Fun()
console.log(f)

new关键字在使用以后会发生什么事情呢?
会在内部创建一个this空对象,最后返回这个空对象

function Fun(){
	var this={}
	return this
}

方式三:通过new和构造函数Object()、String()等

var obj = new Object();

这里的函数称做构造函数(constructor)。
如下图所示

var obj = new Object();
obj.name="xyz123";
obj.age=18;

js原始类型都包含内置构造函数。例如:

var o = new Object();           // 创建一个空对象,和{}一样
var a = new Array();            // 创建一个空数组,和[]一样
var d = new Date();             // 创建一个表示当前时间的Date对象
var r = new RegExp("js");       //创建一个可以进行模式匹配的EegExp对象

方式四:通过Object.create()

Object.create()是一个静态函数,而不是提供给某个对象实例调用的方法.

可以通过传入参数null来创建一个没有原型的新对象,但通过这种方式创建的对象不会继承任何东西,甚至不包括基础方法,比如toString()

var obj = Object.create(null); //不继承任何属性和方法

如果想创建一个普通的空对象(比如通过{}或new Object()创建的对象),需要传入Object.prototype:

var obj2 = Object.create(Object.prototype); //obj和{}和new Object()一样

我们再来谈谈this关键字

  1. 在一般函数方法中使用 this 指代全局对象,预编译过程指向window
function test(){
    this.x = 1;
    alert(this.x);
  }
  test(); // 1
  1. 作为对象方法调用,this 指代上级对象
function test(){
  alert(this.x);
   }
	var a = {};
	a.x = 1;
	a.m = test;
	a.m(); // 1
  1. 作为构造函数调用,this 指代new 出的对象
function test(){
    this.x = 1;
  }
  var a = new test();
  alert(a.x); // 1
  1. call/apply/bind可以改变this的指向
		var obj={
            name:'xxx',
            getName:function(){
                console.log(this.name)
            }
        }
        var Obj2={
            name:'yyy'
        }
        var name='zzz'
        obj.getName()//xxx
        obj.getName.call();//zzz
        obj.getName.call(Obj2);//yyy
        obj.getName.apply();//zzz
        obj.getName.apply(Obj2);//yyy
        obj.getName.bind(this)();//zzz
        obj.getName.bind(Obj2)();//yyy

严格模式下

"use strict";
        var fn=function(){
            return this
        }    
        fn() ==undefined;//true

可以看出,在严格模式下,fn是被直接调用的,并没有没有被执行环境所定义,也就是说不是作为对象的属性或方法调用的(如window.fn())

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值