要总结这些,从问几个问题开始。
一,什么是类?
“类”这个概念,是面向对象(Object-Oriented,OO)的语言都有的一个标志,通过“类”可以创建任意多个具有相同属性和方法的对象。“类”就是对象的模板,对象就是“类”的实例。
但是,JavaScript 语言的对象体系,不是基于“类”的,而是基于构造函数(constructor)和原型链(prototype)。
二,那什么是构造函数?
我们知道,对象是单个实物的抽象。但如果要表示某一类实物的共同特征,通常就需要一个模板,然后对象根据这个模板生成。
在JS中,构造函数就是专门用来生成实例对象的函数,它就是对象的模板,用来描述实例对象的基本结构。从某种角度来说,构造函数就是用来实现“类”的。
一个构造函数,同样可以生成多个实例对象。
例1: function User(name) { this.name = name; this.isAdmin = false; this.sayHi = function() { alert( "My name is: " + this.name ); }; } let user = new User("Jack"); let user2 = new User("Alex"); user.name //Jack user2.name //Alex
构造函数的用法
构造函数就是一个普通的函数,但是有与其他函数不一样的特征和用法。从例1我们可以看到:
1.函数内部使用了 “this”关键字,代表了所要生成的对象实例。(如果不用 new,很可能会把属性添加到全局对象中。为了防止这个情况,可以在函数内使用 use strict ,或者用
)
检测instanceof
2.生成对象的时候,必须使用 new 命令。
3.函数命名以大写字母开头。
new 命令的原理
使用 new
命令时,它后面的函数依次执行下面的步骤。
1.创建一个空对象,作为将要返回的对象实例。
2.将这个空对象的原型,指向构造函数的 prototype
属性。
3.将这个空对象赋值给函数内部的this
关键字。
4.开始执行构造函数内部的代码。并返回 this
的值。
构造函数的 return
通常,构造函数没有 return
语句。它们的任务是将所有必要的东西写入 this
,并自动转换为结果。
但是,如果这有一个 return
语句,那么规则就简单了:
- 如果
return
返回的是一个对象,则返回这个对象,而不是this
。 - 如果
return
返回的是一个原始类型,则忽略。
换句话说,带有对象的 return
返回该对象,在所有其他情况下返回 this
。
function BigUser() { this.name = "John"; return { name: "Godzilla" }; // <-- 返回这个对象 } alert( new BigUser().name ); // Godzilla,得到了那个对象
另一方面,如果对普通函数(内部没有 this
关键字的函数)使用 new
命令,则会返回一个空对象。
function getMessage() { return 'this is a message'; } var msg = new getMessage(); msg // {} typeof msg // "object"
扩展: new
命令简化的内部流程,可以用下面的代码表示。
function _new(/* 构造函数 */ constructor, /* 构造函数参数 */ params) { // 将 arguments 对象转为数组 var args = [].slice.call(arguments); // 取出构造函数 var constructor = args.shift(); // 创建一个空对象,继承构造函数的 prototype 属性 var context = Object.create(constructor.prototype); // 执行构造函数 var result = constructor.apply(context, args); // 如果返回结果是对象,就直接返回,否则返回 context 对象 return (typeof result === 'object' && result != null) ? result : context; } // 实例 var actor = _new(Person, '张三', 28);
三,JS创建对象的几种方式,以及在JS怎么实现类
一般来说,在 JavaScript 中要创建新的对象,通常有以下几种办法。对象字面量
动态绑定方式
工厂方式
构造函数方式(我是说真正的函数,而不是隶属于类代码块里面的构造函数)原型方式
其他(指混合了以上三种方法的方案,也不可小觑)