面向对象系列之一--原型
- 1. 如何理解原型?
- 1.1. 不纠结任何术语,比如说:“人是人他妈生的,妖是妖他妈生的。”
- 1.1.1. 1.人和妖都是对象,而人他妈和妖他妈就是构造函数,人他爸和妖他爸就是原型。
- 1.1.2. 2.人他妈如何才能正确找到人他爸,而不会找错呢?答案就是prototype属性,人他妈可以通过这条线准确的找到自己的老公(人他爸)。同理,人他爸可以通过constructor属性准确的找到自己的老婆(人他妈)。
- 1.1.3. 3.人他妈可以生很多的宝宝,但是这些宝宝只有一个粑粑。这就是原型的唯一性。
- 1.1.4. 4.通过人可以找到人他爸,在通过人他爸找到人他爸他爸,…,这样一条链就叫做原型链。
- 1.1.5. 5.原型链并不是无限无尽的,最终人他爸他爸…他爸不是人,而是null,也就是说最终原型链最终指向null。
- 1.1.6. 6.人他妈生的人长的像人他爸的样子,妖他妈生的妖会像妖他爸那样丑陋,这就叫做继承。
- 1.1.7. 7.人继承了人他爸的一切,人他爸继承了人他爸他爸的一切,…,这就是原型链继承。
- 1.1.8. 8.人恋爱了,她妈让人拿着房产去提亲,人若没有,就问人他爸;人他爸没有,就会问人他爸他爸…,这就是属性搜索原型。
- 1.1.9. 9.人继承了人他爸的发色,但是人可以来个洗剪吹。那么这就是说对象的属性可以自定义,会覆盖继承得到的属性。
- 1.1.10. 10.即使人洗剪吹变成了黄毛怪,但也无法改变人他爸的发色。人他妈生的弟弟妹妹不会是黄毛怪,这就是说对象无法改变原型的属性。
- 1.1.11. 11.人他爸爱嘚瑟,去趟泰国动个小手术又去趟韩国整个形,虽然还是人他爸,但相比从前,已是回炉再造啦。这就是原型的重写。也是原型的置换。
- 1.1. 不纠结任何术语,比如说:“人是人他妈生的,妖是妖他妈生的。”
- 2. !!Code: show time!!
如何理解原型?
不纠结任何术语,比如说:“人是人他妈生的,妖是妖他妈生的。”
1.人和妖都是对象,而人他妈和妖他妈就是构造函数,人他爸和妖他爸就是原型。
2.人他妈如何才能正确找到人他爸,而不会找错呢?答案就是prototype属性,人他妈可以通过这条线准确的找到自己的老公(人他爸)。同理,人他爸可以通过constructor属性准确的找到自己的老婆(人他妈)。
3.人他妈可以生很多的宝宝,但是这些宝宝只有一个粑粑。这就是原型的唯一性。
4.通过人可以找到人他爸,在通过人他爸找到人他爸他爸,…,这样一条链就叫做原型链。
5.原型链并不是无限无尽的,最终人他爸他爸…他爸不是人,而是null,也就是说最终原型链最终指向null。
6.人他妈生的人长的像人他爸的样子,妖他妈生的妖会像妖他爸那样丑陋,这就叫做继承。
7.人继承了人他爸的一切,人他爸继承了人他爸他爸的一切,…,这就是原型链继承。
8.人恋爱了,她妈让人拿着房产去提亲,人若没有,就问人他爸;人他爸没有,就会问人他爸他爸…,这就是属性搜索原型。
9.人继承了人他爸的发色,但是人可以来个洗剪吹。那么这就是说对象的属性可以自定义,会覆盖继承得到的属性。
10.即使人洗剪吹变成了黄毛怪,但也无法改变人他爸的发色。人他妈生的弟弟妹妹不会是黄毛怪,这就是说对象无法改变原型的属性。
11.人他爸爱嘚瑟,去趟泰国动个小手术又去趟韩国整个形,虽然还是人他爸,但相比从前,已是回炉再造啦。这就是原型的重写。也是原型的置换。
!!Code: show time!!
原型的特性
1、不可变性:对象无法修改其原型对象的任何成员
code block:function A() {}
A.prototype.color = 'black';
var a = new A;
a.color = 'goldyellow';
var ad = new A;
console.log(ad.color); // black
console.log(A.prototype.color); // black
console.log(a.color); // goldyellow
2、唯一性:由同一函数创建出来的所有对象共享一个原型对象
function A() {}
A.prototype.color = 'black';
var a = new A;
var ad = new A;
console.log(a.__proto__ === ad.__proto__); // true
console.log(ad.color); // black
console.log(a.color); // black
3、动态性 (就是可以用点会或者是【】来调用)
<1
function A() {}
A.prototype.color = 'black';
var a = new A;
var ad = new A;
A.prototype.makefood = function (){ console.log('做饭饭.')}
a.makefood(); // 做饭饭
ad.makefood(); // 做饭饭
<2
function A() {}
A.prototype.color = 'black';
var a = new A;
A.prototype = {
constructor: A,
makeup: function() {
console.log('我会化妆.');
}
};
var na = new A;
console.log(a.color); // black
a.makeup();// 报错
na.makeup(); // 我会化妆.
console.log(na.color); // undefined
4、继承性:每一个对象都继承自它的原型对象
function A() {}
A.prototype.color = 'black';
var a = new A;
var na = new A;
console.log(a.color); // black
console.log(na.color);// black