您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

详细了解JavaScript中的构造器

2025/11/11 19:23:38发布218次查看
对构造函数有很好的理解是你掌握javascript这门语言的重点。我们都知道javascript不像其他语言,它没有class关键字,但是它有跟function非常相似的构造函数。这篇文章我们一起来详细地了解javascript构造函数如何构造对象。
构造函数跟普通函数非常相似,但是我们通过new关键字来使用它们。主要有两种类型的构造函数,native构造函数(array,object)它们可以在执行环境中自动生成,还有自定义的构造函数,你可以定义自己的方法和属性。
当你想要创建很多相似的对象(拥有相同的属性和方法)的时候,使用构造函数是非常有效的。大部分程序员都遵循公约,使用大写字母开头来将构造函数和普通函数区分开。看看下面的代码。
function book() { // unfinished code} var mybook = new book();
最后一行代码创建了一个book对象,并把它赋值给变量;这样完成之后,即使book构造器没有做任何操作,mybook也是book实例。正如你看到的,除了首字母大写和使用new关键字之外,构造函数和普通函数并没有什么区别。
判断实例的类型判断某个对象是否为某种实例,我们可以使用instanceof操作符:
mybook instanceof book // => truemybook instanceof string // => false
注意:如果右边不是一个函数的实例,那么将会报错:
mybook instanceof {}; // => typeerror: invalid 'instanceof' operand ({})
另一种方法是使用constructor属性,所有对象实例都有一个constructor属性,这个属性指向创建它的构造函数。
mybook.constructor == book; // => true
就像mybook的constructor指向book一样。 所有对象都从它们的原型上继承了constructor这个属性:
var s = new string("text");s.constructor === string; // => true"text".constructor === string; // => truevar o = new object();o.constructor === object; // => truevar o = {};o.constructor === object; // => truevar a = new array();a.constructor === array; // => true[].constructor === array; // => true
尽管使用constructor可以用来检测实例类型,但是建议还是使用instanceof方法。因为constructor属性是可以被重写的..用起来不太靠谱。
自定义构造函数构造函数就像饼干印模。同一印模制作出来的,都是同一个diao样(男人没一个好东西也是这个道理)。
function book(name, year) { this.name = name; this.year = '(' + year + ')';}
book构造器需要两个参数,当使用new关键字构造对象时,会把两个形参传给book对象的name 和 year。
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);
如你所见,我们可以通过传不同参数,快速创建另一本书。javascript的array(),date()也是这个道理。
object.defineproperty 方法object.defineproperty 方法可以在构造器中被使用来配置属性。
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 falsedelete mybook.name; console.log(mybook.name); // => book: single page web applications// but we can change the value of the name propertymybook.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()。当我们需要创建这些值的时候,我们可以自由选择使用字面量或者构造器。但是相同情况下,字面量对象不仅易读,而且运行速度更快,因为他们可以在解析的时候被优化。所以当你需要使用简单对象的时候就使用字面量吧。
// a number object// numbers have a tofixed() methodvar obj = new object(5);obj.tofixed(2); // => 5.00// we can achieve the same result using literalsvar num = 5;num.tofixed(2); // => 5.00// a string object// strings have a slice() method var obj = new string("text");obj.slice(0,2); // => "te"// same as abovevar string = "text";string.slice(0,2); // => "te"
使用new关键字是必不可少的记得使用构造器的时候要用new关键字,如果你不小心忘记了,那么构造器中的this指向的是global对象(浏览器中默认为window)。
function book(name, year) { console.log(this); this.name = name; this.year = year;}var mybook = book("js book", 2014); console.log(mybook instanceof book); console.log(window.name, window.year);var mybook = new book("js book", 2014); console.log(mybook instanceof book); console.log(mybook.name, mybook.year);
上面的代码运行结果如下所示:
如果是在严格模式下,上面的代码将会抛出错误,因为严格模式不允许我们不使用new关键字调用构造器。
适用范围更高的构造器为了解决可能会忘记使用new关键字的风险,我们可以通过判断this的值创建适用范围更高的构造器。
function book(name) { if (!(this instanceof book)) { // the constructor was called without "new". return new book(name); } }
加上这段代码之后,我们就可以‘肆无忌惮’地使用构造器了。
function book(name, year) { if (!(this instanceof book)) { return new book(name, year); } this.name = name; this.year = year;}var person1 = new book("js book", 2014);var person2 = book("js book", 2014);console.log(person1 instanceof book); // => trueconsole.log(person2 instanceof book); // => true
很多内建的构造器都是这么做的。通过判断this是否为当前类型。如果程序员忘记加new关键字,那么我们就返回一个通过new出来的对象。
结论javascript没有类这种说法(但是它可以使面向对象的),所以对于习惯了使用类的程序员来说是种困惑。当然javascript的构造函数跟普通函数没什么区别,只是通过new关键字生成出来而已。如果我们需要”印饼干”的话,它就非常有用了。
推荐教程:《javascript视频教程》
以上就是详细了解javascript中的构造器的详细内容。
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product