那些你可能不知道的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关键字
- 在一般函数方法中使用 this 指代全局对象,预编译过程指向window
function test(){
this.x = 1;
alert(this.x);
}
test(); // 1
- 作为对象方法调用,this 指代上级对象
function test(){
alert(this.x);
}
var a = {};
a.x = 1;
a.m = test;
a.m(); // 1
- 作为构造函数调用,this 指代new 出的对象
function test(){
this.x = 1;
}
var a = new test();
alert(a.x); // 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())