js面向对象概念解析

ECMAScript有两种开发模式:函数

1.函数式(过程化)测试

2.面向对象(OOP)。this

面向对象的语言有一个标志,那就是类的概念,而经过类能够建立任意多个具备相同属性和方法的对象。可是,ECMAScript没有类的概念,所以它的对象也与基于类的语言中的对象有所不一样。spa

 

建立对象prototype

建立一个对象,而后给这个对象新建属性和方法。对象

方法一:基本写法ip

var box = new Object();   //建立一个 Object对象作用域

  box.name = 'Lee';//建立一个 name属性并赋值开发

  box.age = 100;//建立一个 age属性并赋值原型

  box.run = function () {//建立一个 run()方法并返回值

    return this.name + this.age + '运行中...';

  };

缺点,不能公用,想建立一个相似的对象,就会产生大量的代码。

 

方法二:工厂模式的方法

function createObject(name, age) { //集中实例化的函数

  var obj = new Object();

  obj.name = name;

  obj.age = age;

  obj.run = function () {

    return this.name + this.age + '运行中...';

  };

  return obj;

}

var box1 = createObject('Lee', 100);//第一个实例

var box2 =createObject('Jack',200);//第二个实例

alert(box1.run());   //Lee100运行中...

alert(box2.run());   //Jack200运行中...

工厂模式解决了重复实例化的问题,但还有一个问题,那就是识别问题,由于根本没法搞清楚他们究竟是哪一个对象的实例。

 

方法三:构造函数(构造方法)

function Box(name, age) {//构造函数模式

  this.name = name;

  this.age = age;

  this.run = function () {

    return this.name + this.age + '运行中...';

  };

}

var box1 = new Box('Lee', 100);

var box2 = new Box('Jack',200);

alert(box1.run());
alert(box1 instanceof Box); //很清晰的识别他从属于 Box

使用构造函数的方法,即解决了重复实例化的问题,又解决了对象识别的问题

 

构造函数的方法和工厂模式的方法有何不一样之处?

1.构造函数方法没有显式的建立对象(new Object());
2.直接将属性和方法赋值给 this 对象;
3.没有 return 语句。
构造函数的方法有一些规范:
1.函数名和实例化构造名相同且大写,(PS:非强制,但这么写有助于区分构造函数和普通函数);
2.经过构造函数建立对象,必须使用 new 运算符。


既然经过构造函数能够建立对象,那么这个对象是哪里来的,new Object()在什么地方执行了?

执行的过程以下:
1.当使用了构造函数,而且 new 构造函数(),那么就后台执行了 new Object();
2.将构造函数的做用域给新对象,(即 new Object()建立出的对象),而函数体内的 this 就表明 new Object()出来的对象。
3.执行构造函数内的代码;
4.返回新对象(后台直接返回)。

构造函数和普通函数的惟一区别,就是他们调用的方式不一样。只不过,构造函数也是函数,必须用 new 运算符来调用,不然就是普通函数。

判断一个对象是否指向了该构造函数的原型对象,可使用 isPrototypeOf()方法来测试。

alert(Box.prototype.isPrototypeOf(box));            //只要实例化对象,即都会指向

相关文章
相关标签/搜索