JavaScript之创建对象

jk 1年前 ⋅ 9704 阅读

源于:今日头条(查看原文)

ECMAScript 有两种开发模式:1.函数式(过程化),2.面向对象(OOP)。面向对象的语言有一个标志,那就是类的概念,而通过类可以创建任意多个具有相同属性和方法的对象。 但是,ECMAScript 没有类的概念,因此它的对象也与基于类的语言中的对象有所不同。

JavaScript之创建对象

//创建对象,给对象加属性和方法

var human = new Object();

human.name = '张三丰';

human.ability = function() {

return '打太极';

}

alert(human.name);

alert(human.ability())

创建第二个对象,名字为乔丹,能力是打篮球。

var human = new Object();

human.name = '乔丹';

human.ability = function() {

return '打篮球';

}

alert(human.name);

alert(human.ability())

上面创建对象,并且创建属性和方法,这种是 JavaScript 创建对象最基本的方法,但有个缺点,想创建一个类似的对象,就会产生大量的代码。为了解决多个类似对象声明的问题, 我们可以使用一种叫做 工厂模式的方法, 这种方法就是为了解决实例化对象产生大量重复的问题。

// 工厂方法创建对象

function createObj(name,ability) {

var obj = new Object();

obj.name = name;

obj.ability = function() {

return ability;

}

return obj;

}

var human1 = createObj('张三丰','打太极');

alert(human1.name);

alert(human1.ability());

var human2 = createObj('乔丹','打篮球');

alert(human2.name);

alert(human2.ability());

工厂模式解决了重复实例化的问题,但还有一个问题,那就是识别问题,因为根本无法搞清楚他们到底是哪个对象的实例。ECMAScript 中可以采用 构造函数(构造方法)可用来创建特定的对象。

// 构造函数

function Human(name,ability) {

this.name = name;

this.ability = function() {

return ability;

}

}

function Car(name) {

this.name = name;

}

var man1 = new Human('张三丰','打太极');

alert(man1.name)

alert(man1.ability());

var man2 = new Human('李宁','体操');

alert(man2.name)

alert(man2.ability());

var car1 = new Car('宝马');

alert(car1.name);

alert(man1 instanceof Human);//true

alert(man2 instanceof Human);//true

alert(car1 instanceof Human);//false

使用构造函数的方法,即解决了重复实例化的问题,又解决了对象识别的问题,但问题是,这里并没有 new Object(),为什么可以实例化 Box(),这个是哪里来的呢?


使用了构造函数的方法,和使用工厂模式的方法他们不同之处如下:

1.构造函数方法没有显示的创建对象(new Object());

2.直接将属性和方法赋值给 this 对象;

3.没有 renturn 语句。


构造函数的方法有一些规范:

1.函数名和实例化构造名相同且大写,(非强制,但这么写有助于区分构造函数和普通函数);

2.通过构造函数创建对象,必须使用 new 运算符。


既然通过构造函数可以创建对象,那么这个对象是哪里来的,new Object()在什么地方执行了?执行的过程如下:

1.当使用了构造函数,并且 new 构造函数(),那么就后台执行了 new Object();

2.将构造函数的作用域给新对象,(即 new Object()创建出的对象),而函数体内的 this 就代表 new Object()出来的对象。

3.执行构造函数内的代码;

4.返回新对象(后台直接返回)。


关于 this 的使用,this 其实就是代表当前作用域对象的引用。如果在全局范围 this 就代表 window 对象,如果在构造函数体内,就代表当前的构造函数所声明的对象。

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


全部评论: 0

    我有话说: