- 类:对一系列具有相同特征和行为的事物的抽象的集合
- 对象:类的一个具体实例
一、 面向对象编程
(一)对象的创建
1.{ }
JavaScript用一个花括号 { } 表示一个对象,对象中的成员通过键值对 key: value (键与值以冒号分割) 的形式进行声明,成员与成员之间通过逗号来分隔。如下,定义一个学生对象 liming:
var liming = {
name: '李明', // 姓名
gender: 'male', // 性别
examination: function() {
console.log('参加...');
}
};
2、new Object()
创建JavaScript对象,还可以通过 Object 的构造函数和new关键字来构造JavaScript对象
var linhai = new Object();
linhai.name = '林海'; // 姓名
linhai.gender = 'male'; //性别
linhai.examination = function () {
console.log('参加...');
};
提示:
- 对象中未赋值的属性,它的值为 undefined
- 在JavaScript中,对象可以被理解为是一系列属性的集合,本质上是一种无序的集合数据类型,它由若干键值对所组成。即是一个包含相关数据和方法的集合。
3、构造函数(构建函数)
(1)通过创建一个构造函数来定义对象的类型(构造函数的首字母一般采取大写方式)
(2)通过 new 创建对象实例
function Student(stuNo, major, name, gender, birth, examination) {
this.name = name;
this.gender = gender;
this.examination = examination;
}
var xiaochi = new Student('小池', 'female', function(){console.log('参加...')});
console.log(xiaochi.name); // 访问属性
xiaochi.examination(); // 调用方法
4、create( )
使用 JavaScript内嵌的方法 create()
来创建对象,它允许我们 基于现有对象取创建新的对象。
var xiaochi = new Student('小池', 'female',function () {
console.log('参加...')
});
var ming = Object.create(xiaochi)
console.log(ming.name); // 小池
ming.examination(); // 参加考试...
二、对象原型
JavaScript 一种基于原型的语言。在JavaScript中,每个对象都拥有一个原型对象,对象以其原型为模板、从原型中继承方法和属性。 原型对象也可能拥有原型,并从中继承方法和属性,一层一层、以此类推,这种关系常被称为 原型链。
更准确地说,这些属性和方法是被定义在 Object 的构造器函数之上的 prototype 属性上,而非对象实例本身。
在 Javascript中,函数可以有属性。 每个函数都有一个特殊的属性叫作原型(prototype),我们可以通过 prototype 属性来访问原型
// 函数声明
function doSomething() {}
console.log(doSomething.prototype);
// 函数表达式
var doSomething = function () {};
console.log(doSomething.prototype);
instance 的 __proto__
(proto左右各有两个下划线) 属性就是 doSomething.prototype
当我们访问 instance 的属性时:
-
浏览器首先会查找 instance 是否具有这个属性。
-
如果没有,浏览器接着会在 instance 的
__proto__
中去查找这个属性。如果 instance 的__proto__
有这个属性,那么这个属性就会被 instance 引用。 -
如果instance 的
__proto__
也没有这个属性,那么浏览器就会再去查找 instance 的__proto__
的__proto__
是否有这个属性,依次一层一层沿着这条 “原型链“ 往上查找。 -
最后,如果原型链上的所有的
__proto__
都被找完了, 浏览器所有已经声明的__proto__
上都不存在这个属性,那这个属性的值就为 undefined。 -
默认情况下,所有函数的原型属性
__proto__
就是 window.Object.prototype 。并且,原型链中的方法和属性没有被复制到其他对象中,它们需要通过前面所说的原型链的方式才能被访问。
1. prototype(原型):
每个函数对象 都有一个特殊的属性,称为 prototype。这是一个对象,拥有该函数实例的共享属性和方法。
函数的 prototype 是一个对象,可以包含该函数实例的 共享属性和方法。
2. proto(隐式原型):
每个实例对象 都有一个指向它们构造函数的 prototype 的指针,称为 __proto__
。它是一个隐藏属性。
实例对象的 __proto__
指向了创建它的 构造函数的 prototype。