这里有新鲜出炉的 Javascript 教程,程序狗速度看过来!
Javascript 是一种由 Netscape 的 LiveScript 发展而来的原型化继承的基于对象的动态类型的区分大小写的客户端脚本语言,主要目的是为了解决服务器端语言,比如 Perl,遗留的速度问题,为客户提供更流畅的浏览效果。
构造函数就是初始化一个实例对象,对象的 prototype 属性是继承一个实例对象。本文给大家分享 javascript 构造函数详解,对 js 构造函数相关知识感兴趣的朋友一起学习吧
构造函数就是初始化一个实例对象,对象的 prototype 属性是继承一个实例对象。
构造函数注意事项:
1. 默认函数首字母大写
2. 构造函数并没有显示返回任何东西。new 操作符会自动创建给定的类型并返回他们,当调用构造函数时,new 会自动创建 this 对象,且类型就是构造函数类型。
3. 也可以在构造函数中显示调用 return. 如果返回的值是一个对象,它会代替新创建的对象实例返回。如果返回的值是一个原始类型,它会被忽略,新创建的实例会被返回。
- function Person( name){
- this.name =name;
- }
- var p1=new Person('John');
等同于:
- function person(name ){
- Object obj =new Object();
- obj.name =name;
- return obj;
- }
- var p1= person("John");
4. 因为构造函数也是函数,所以可以直接被调用,但是它的返回值为 undefine,此时构造函数里面的 this 对象等于全局 this 对象。this.name 其实就是创建一个全局的变量 name。在严格模式下,当你补通过 new 调用 Person 构造函数会出现错误。
5. 也可以在构造函数中用 Object.defineProperty() 方法来帮助我们初始化:
- function Person( name){
- Object.defineProperty(this, "name"{
- get :function(){
- return name;
- },
- set:function (newName){
- name =newName;
- },
- enumerable :true, //可枚举,默认为false
- configurable:true //可配置
- });
- }
- var p1=new Person('John');
6. 在构造函数中使用原型对象
- //比直接在构造函数中写的效率要高的多
- Person.prototype.sayName= function(){
- console.log(this.name);
- };
但是如果方法比较多的话,大多人会采用一种更简洁的方法:直接使用一个对象字面形式替换原型对象,如下:
- Person.prototype ={
- sayName :function(){
- console.log(this.name);
- },
- toString :function(){
- return "[Person "+ this.name+"]" ;
- }
- };
这种方式非常流行,因为你不用多次键入 Person.prototype,但有一个副作用你一定要注意:
使用字面量形式改写了原型对象改变了构造函数的属性,因此他指向 Object 而不是 Person。这是因为原型对象具有一个 constructor 属性,这是其他对象实例所没有的。当一个函数被创建时,它的 prototype 属性也被创建,且该原型对象的 constructor 属性指向该函数。当使用对象字面量形式改写原型对象时,其 constructor 属性将被置为泛用对象 Object. 为了避免这一点,需要在改写原型对象的时候手动重置 constructor, 如下:
- Person.prototype ={
- constructor :Person,
- sayName :function(){
- console.log(this.name);
- },
- toString :function(){
- return "[Person "+ this.name+"]" ;
- }
- };
再次测试:
p1.constructor===Person
true
p1.constructor===Object
false
p1 instanceof Person
true
来源: http://www.phperz.com/article/17/0415/267884.html