【javascript基础】六、new与构造函数

前言

上篇说建立对象的时候提到了带返回值的构造函数,那里没有和你们说这个问题,今天就和你们一块儿学习构造函数和new操做符。我也是最近才稍微弄明白点这个构造函数,之前老是忽略一些问题,如今就是想到哪块不行,就研究下,查查资料,本身捣鼓捣鼓,但愿你们也随手记一下本身忽然想起的哪块不熟悉知识点。javascript

javascript中的类

JavaScript 是面向对象的语言,可是他的面向对象不是基于类的,是基于原型的。javascript中没有是类,任何所谓的类都是咱们模拟的,其中一种方法就是经过构造函数来模拟类。在面向对象编程中,类(class)是对象(object)的模板,定义了同一组对象(又称"实例")共有的属性和方法。Javascript语言不支持"类",可是能够用一些变通的方法,模拟出"类"。html

function Dog() {
    this.name = "旺财";
  }
//建立一个对象
var dog = new Dog();

你们能够看一些这篇文章http://www.ruanyifeng.com/blog/2012/07/three_ways_to_define_a_javascript_class.htmljava

构造函数与new

啥时构造函数,我一时也说不明白,我知道在javascript中构造函数是建立自定义类型的,像Array,String等这些是原生的类型,这些是原来就有的,咱们能够直接使用这些类型建立对象,假如你想要建立一个新的自定义类型,好比类型Person,没办法了使用原生的类型,须要自定义了。构造函数是一种特殊的方法,主要用来在建立对象时初始化对象,即为对象成员变量赋初始值,总与new运算符一块儿使用在建立对象的语句中。编程

构造函数也是函数,只不过是一个特殊的函数,之因此叫构造函数是由于和new放在了一块儿,不和new一块儿使用他就是一个普通的函数。数组

function Person(name){
   this.name = name;
}
//普通函数
Person("hainan");
console.log(window.name);//hainan
//构造函数
var person = new Person("Allenxing");
console.log(person.name);//Allenxing

估计你们看明白了,构造函数和普通函数没有什么区别,普通函数和new一块儿使用,那么普通函数也能够叫构造函数,记住在new后面的就叫构造函数。函数

咱们用一个普通的函数new出来了一个对象,如何new的一会说。学习

new的过程

表面看起来是一个简单的过程,实际上是一个蛮复杂的流程: this

  1. 建立一个空对象。
  2. 设置这个对象的原型,就是指定__proto__的指向
  3. 将构造函数的做用域赋给新对象(所以this就指向了新对象)
  4. 执行构造函数中的代码(给这个新对象添加方法和属性)
  5. 返回这个对象(this)

这个是默认的流程,是最简单的流程,通常咱们new一个对象的时候这些都是看不到的,咱们知道获得最后的结果,如今咱们能够模拟一些这个流程,一步一步来就能够了spa

function Person(name){
   var  obj = new Object();//新建对象
   obj.name = name;//赋值属性
   obj.__proto__ = Person.prototype;//指定对象中的指针
   return obj;//返回对象
}
Person.prototype.getName = function(){
   console.log(this.name);
}

var person = new Person("hainan");
person.getName();

看看咱们的结果prototype

就是这样子了,和原来new出来的同样,哦了。

这个是默认的构造函数,是没有返回值的构造函数,要是咱们的构造函数有返回值了,那么结果会是什么样的呢?看一个例子

function Person(name){
   this.name = name;
   var obj = new Object();
   obj.name = "Allenxing";
   return obj;
}
var person = new Person("hainan");
console.log(person.name);//Allenxing

看出来了吧,返回的是return 以后的值,而不是默认的this,那是否是返回全部的值会都覆盖原来的this对象呢?瞧瞧看

function Person(name){
   this.name = name;
   return "Allenxing";
}
var person = new Person("hainan");
console.log(person.name);//hainan

显然不是这样的,这个例子并无覆盖返回原来的this对象。

总结一下,若是构造函数中返回的是一个对象,数组,那么就会覆盖返回原来的this对象,若是不是对象和数组,即便是undefined,null和 空 都是返回this对象。你们能够试试看,咱试两个看看

function Person(name){
   this.name = name;
   return new String("Allenxing");//对象
}
var person = new Person("hainan");
console.log(person.name);//undefined
function Person(name){
   this.name = name;
   return undefined;
}
var person = new Person("hainan");
console.log(person.name);//hainan

这里就不在实验了,有兴趣你们试一下。

小结

今天和你们说了一下new和构造函数,只有new以后的函数才叫构造函数,不然都是普通函数,固然这都是概念,不用太较真,只要懂原理了爱叫什么叫什么。有啥问题请你们指正。

PS:祝有对象的道友,情人节快乐!暂无对象的道友,元宵节快乐!

相关文章
相关标签/搜索