创建对象

对象

封装了属性和方法,对象是无序列表
面向对象 OOP
【创建对象】Object Oriented Programming
基本概念
一个对象用数据值来描述它的状态;对象及其操作就是对象的行为。对象实现了数据和操作的结合,使数据和操作封装于对象的统一体中
特性
  • 对象唯一性 : 对象都有自身唯一标识
  • 抽象性 : 具有一致的数据结构(属性)和行为(操作)的对象抽象
  • 继承性 : 子类自动共享父类的数据结构和方法机制
  • 多态性 : 相同的操作或函数、过程可作用于多种类型的对象上并获得不同的结果
  • 封装 : 只能通过对象来访问方法
    要素
  • 抽象 : 强调实体的本质、内在的属性
  • 封装性 : 保证软件部件具有优良的模块性
  • 共享性 : 面向对象技术在不同级别上促进了共享
创建对象 1. 使用 new 关键字
var obj = new Object(); obj.name = 'zs' obj.age = 12 obj.test = function () { console.log(this.name + '参加考试'); }

2. 字面量
var obj = { name: 'zs', age: 12 test : function () { console.log(this.name + '参加考试'); } }

3. 工厂函数
function createPerson(name,age) { var obj = new Object(); obj.name = name; obj.age = age; obj.test = function () { console.log(this.name + '参加考试'); } return obj; } var p1 = new createPerson('xiaomi',12);

没有解决对象识别问题(即怎样知道一个对象的类型)
4. 构造函数
  • 静态成员 -- 直接给构造函数添加的成员
  • 静态成员不能使用对象的方式来调用
  • 静态成员使用构造函数来调用
// 函数中的this就是创建出来的对象 function CreatePerson(name,age) { this.name = name; this.age = age; this.showName = function () { console.log(this.name + '参加考试'); } } var p1 = new CreatePerson('小米',14); p1.showName()// 缺点 : 每个方法都要在每个实例上重新创建一遍

// 将函数提到构造函数之外,但构造函数只是封装了少量属性,方法都在构造函数之外,降低了构造函数的 **封装性** function CreatePerson(name, age) { this.name = name; this.age = age; this.showName = showName; } function showName() { console.log(this.name + '参加考试'); } var p1 = new CreatePerson('小米', 14); p1.showName()

5. 原型
  • 每个函数都有一个prototype 属性,这个属性是一个指针,它本身也是一个对象,指向的这个构造函数
  • prototype的constructor属性指向构造函数
  • constructor作用记录了创建该对象的构造函数 记录了创建该对象的构造函数
function Person(name,age) { Person.prototype.name = name; Person.prototype.age = age; Person.prototype.sayHi = function(){ console.log('大家好,我是'+ this.name); } } var p1 = new Person('zs',17); p1.sayHi()

6. 混合模式
  • 构造函数 : 用于定义实例属性
  • 原型 : 用于定义方法和共享的属性
function Person(name,age) { this.name = name; this.age = age; } Person.prototype.sayHi = function(){ console.log('大家好,我是'+ this.name); } var p1 = new Person('zs',17); p1.sayHi()

    推荐阅读