详细了解JavaScript中的构造器


本文摘自PHP中文网,作者青灯夜游,侵删。

对构造函数有很好的理解是你掌握JavaScript这门语言的重点。我们都知道JavaScript不像其他语言,它没有class关键字,但是它有跟function非常相似的构造函数。这篇文章我们一起来详细地了解JavaScript构造函数如何构造对象。

构造函数跟普通函数非常相似,但是我们通过new关键字来使用它们。主要有两种类型的构造函数,native构造函数(Array,Object)它们可以在执行环境中自动生成,还有自定义的构造函数,你可以定义自己的方法和属性。

当你想要创建很多相似的对象(拥有相同的属性和方法)的时候,使用构造函数是非常有效的。大部分程序员都遵循公约,使用大写字母开头来将构造函数和普通函数区分开。看看下面的代码。

1

2

3

4

function Book() {

    // unfinished code

}

var myBook = new Book();

最后一行代码创建了一个Book对象,并把它赋值给变量;这样完成之后,即使Book构造器没有做任何操作,myBook也是Book实例。正如你看到的,除了首字母大写和使用new关键字之外,构造函数和普通函数并没有什么区别。

判断实例的类型

判断某个对象是否为某种实例,我们可以使用instanceof操作符:

1

2

myBook instanceof Book    // => true

myBook instanceof String  // => false

注意:如果右边不是一个函数的实例,那么将会报错:

1

myBook instanceof {}; // => TypeError: invalid 'instanceof' operand ({})

另一种方法是使用constructor属性,所有对象实例都有一个constructor属性,这个属性指向创建它的构造函数。

1

myBook.constructor == Book;   // => true

就像myBook的constructor指向Book一样。 所有对象都从它们的原型上继承了constructor这个属性:

1

2

3

4

5

6

7

8

9

10

var s = new String("text");

s.constructor === String;      // => true

"text".constructor === String; // => true

var o = new Object();

o.constructor === Object;      // => true

var o = {};

o.constructor === Object;      // => true

var a = new Array();

a.constructor === Array;       // => true

[].constructor === Array;      // => true

尽管使用constructor可以用来检测实例类型,但是建议还是使用instanceof方法。因为constructor属性是可以被重写的..用起来不太靠谱。

自定义构造函数

构造函数就像饼干印模。同一印模制作出来的,都是同一个diao样(男人没一个好东西也是这个道理)。

1

2

3

4

function Book(name, year) {

    this.name = name;

    this.year = '(' + year + ')';

}

Book构造器需要两个参数,当使用new关键字构造对象时,会把两个形参传给Book对象的name 和 year。

1

2

3

4

5

6

7

var firstBook = new Book("Pro AngularJS", 2014);

var secondBook = new Book("Secrets Of The JavaScript Ninja", 2013);

var thirdBook = new Book("JavaScript Patterns", 2010);

 

console.log(firstBook.name, firstBook.year);          

console.log(secondBook.name, secondBook.year);          

console.log(thirdBook.name, thirdBook.year);

1.png

如你所见,我们可以通过传不同参数,快速创建另一本书。JavaScript的Array(),Date()也是这个道理。

Object.defineProperty 方法

Object.defineProperty 方法可以在构造器中被使用来配置属性。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

function Book(name) {

    Object.defineProperty(this, "name", {

        get: function() {

            return "Book: " + name;      

        },       

        set: function(newName) {           

            name = newName;       

        },              

        configurable: false    

    });

}

var myBook = new Book("Single Page Web Applications");

console.log(myBook.name);    // => Book: Single Page Web Applications

// we cannot delete the name property because "configurable" is set to false

delete myBook.name;   

console.log(myBook.name);    // => Book: Single Page Web Applications

// but we can change the value of the name property

myBook.name = "Testable JavaScript";

console.log(myBook.name);    // => Book: Testable JavaScript

上面的代码中是调用了祖先的方法。它提供了getter和setter接口。getter方法负责返回封装的值,setter方法接受参数,并把值赋给属性。当我们在某个属性上操作存取时,调用的就是这两个方法。通过配置configurable,我们可以设置该值能否被删除。

对象字面量表示法是首选的构造函数

JavaScript语言九种内建的构造器:Object(), Array(), String(), Number(), Boolean(), Date(), Function(), Error() 以及 RegExp()。当我们需要创建这些值的时候,我们可以自由选择使用字面量或者构造器。但是相同情况下,字面量对象不仅易读,而且运行速度更快,因为他们可以在解析的时候被优化。所以当你需要使用简单对象的时候就使用字面量吧。

阅读剩余部分

相关阅读 >>

javascript怎么删除对象的属性

nodejs与javascript的区别

javascript中什么值是假值

javascript怎么停止函数执行

浅谈javascript事件模拟

return/break语句的用法技巧(代码示例)

javascript怎么改页面文字

javascript是前端还是后端

移动端h5开发遇到的问题及解决方法

javascript需要搭建环境吗

更多相关阅读请进入《javascript》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...