总结构造函数,创建对象,以及类的实现

要总结这些,从问几个问题开始。

一,什么是类?

”这个概念,是面向对象(Object-OrientedOO)的语言都有的一个标志,通过“”可以创建任意多个具有相同属性和方法的对象。“类”就是对象的模板,对象就是“类”的实例。

但是,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 中要创建新的对象,通常有以下几种办法。对象字面量

动态绑定方式

工厂方式

构造函数方式(我是说真正的函数,而不是隶属于类代码块里面的构造函数)原型方式

其他(指混合了以上三种方法的方案,也不可小觑)

对象字面量

猜你喜欢

转载自www.cnblogs.com/zhangzidian/p/13374297.html