原型链
2019-06-25 本文已影响0人
Grayly吖
一、原型(是个对象)
- 自定义构造函数(构造器)
// 自定义构造函数(构造器)
function MadeCat(name, age, addr) {
this.name = name;
this.age = age;
this.addr = addr;
}
- (2)访问方式一、构造器中包含prototype,可以通过构造函数的prototype来访问原型
// 访问方式1: 通过构造函数的prototype访问
var p = MadeCat.prototype;
console.log('MadeCat的原型是', p);
- (3)访问方式二、实例中包含
__proto__
,可以通过实例的__proto__
来访问原型- 通过同一个构造函数创建出来的对象(实例)都指向同一个原型
var p1 = cat.__proto__;
var p2 = cat2.__proto__;
console.log(p1 === p2); //true
- (4)原型对象中又包含constructor,它又指向构造器,可以通过原型中的constructor来访问构造器
二、在原型上定义的属性和方法
- 在原型上定义的属性和方法,创建出来的实例也会拥有原型上的属性和方法
- 实例上有属性就用实例的属性,实例上没有就去找原型上的属性,原型上没有就去找原型的原型(原型链终极)上的属性
// 自定义构造函数(构造器)
function MadeCat(name, age, addr) {
this.name = name;
this.age = age;
this.addr = addr;
}
//1、在原型上定义属性和方法
MadeCat.prototype.color = '白色';
MadeCat.prototype.call = function () {
console.log('咩,咩,咩');
}
//2、创建出来的实例也会拥有原型上的属性和方法
var cat = new MadeCat('咖菲猫', 2, '美国');
console.log(cat); //实例
console.log(cat.color);
cat.call();
实例也拥有原型上的属性和方法
三、数组、日期、正则都属于对象(万物皆为对象)
- 原型链终极例子:(数组、日期)的原型的原型如下:
var arr = new Array();
var date = new Date();
console.log(arr.__proto__.__proto__ === Object.prototype); //true
console.log(date.__proto__.__proto__ === Object.prototype); // true
四、原型链
- 在JavaScript中万物都是对象,对象和对象之间也有关系,并不是孤立存在的。对象之间的继承关系,在JavaScript中是通过prototype对象指向父类对象(原型),再通过
__proto__
指向Object对象为止,这样就形成了一个原型指向的链条,专业术语称之为原型链。
原型链图解1
小试牛刀
var F = function () { };
Object.prototype.a = function () {
console.log("aa");
};
Function.prototype.b = function () {
console.log("bb");
};
var f = new F();
F.a();
F.b();
f.a();
答案:aa bb aa 报错
function A() {
this.name = 'a'
this.color = ['green', 'yellow']
}
function B() {
}
B.prototype = new A()
var b1 = new B()
var b2 = new B()
b1.name = 'change'
b1.color.push('black')
console.log(b2.name)
console.log(b2.color)
答案: a , ['green', 'yellow','black']