面向对象

面向对象
面向对象是程序设计语言中一种常见的思想。
就现实世界而言,整个世界是由各种各样具备规律和状态的对象所组成,这是一种认知自然世界的哲学。
JavaScript是一种基于对象,但书写上又不同于传统面向对象编程的一门语言
原型和原型链
JavaScript的函数没有签名,所以不支持接口继承。
在JavaScript中继承由原型链来实现。
基于原型的继承模型比传统的类继承更要强大JavaScript可以通过原型的继承来模拟类继承,而一个类继承的模型想要模拟原型继承却要难得多
在JavaScript中每一个对象都有一个指向其原型对象的内部引用,而这个原型对象又通过引用指向其原型,直到某个对象的原型为null,这种一级一级的链结构就被称为原型链
继承属性和方法
这种基于原型的继承第一个表现在对象的继承属性(方法也包含在其中),JavaScript对象有一个指向原型对象的链,当访问一个对象的属性时,JavaScript不仅会在该对象上查找,也会在该对象的原型上查找
继承方法需要注意的是,当方法被调用时的 this 指向为当前继承的对象,而不是继承的函数所在的原型对象
var o = { //一个基本对象包含两个属性,其中一个属性是方法
a: 2,
b: function () {
return this.a + 1;
}
};
console.log(o.b()); //当调用 o.b时, this 指向是o,所以o.b()为 3
var p = Object.create(o);
p.a = 12; //创造p的属性a ,当原型在p中查找a 时,先找这个值
console.log(p.b()); // 当调用p.b时, this 指向p, 所以o.b()为 13
创造对象和生成原型链
创造对象和生成原型链的方法主要有四种
class关键字(ES6)
使用普通语法创建对象
var o = {
a: 1,
}
使用构造器创造对象
function Person(name) {
this.name = name || ‘无名氏’;
this.act = function () {
alert(‘你好啊’);
}
};
var p = new Person(‘小张’);
使用Object.create创造对象
该方法在es5中加入,可以方便的通过一个对象原型创造一个新的对象,新对象的原型即为使用create方法传入的第一个参数
Object.create(prototype, description)
proto、prototype和constructor
‘’proto‘’属性相当于 ‘’ someObject.[[Prototype]] ‘’
用来指派someObject的原型,存在于所有对象之上。
一个对象 var a {b:1 } 那么a的_proto_ 就是一个空的对象
一个字符串的 proto 是一个String对象,String对象的_proto_又再指向空对象
prototype 是构造函数拥有的一个属性,这个属性指向的是构造函数的原型对象,原型对象的存在意味着这个对象的所有属性和方法,都可以被构造函数的实例继承。

对开发者来说,需要把所有的共享属性和方法放入这个对象中,在实例化的时候只需要引用这部分即可,减少了对内存的占用
proto 和 prototype 的关系
string 的 proto 是一个名为 String 的对象,
这个对象就是 String 构造器的原型对象,
而String构造器的 prototype 就是 String实例的 proto
构造器构造对象的过程
var o = new Foo(); //构造器构造对象
//构造器构造对象的过程
var o = new Object(); //用Object 构造器构造一个对象
o.proto = Foo.prototype; //将对象的 proto 指向构造器的prototype
Foo.call(o); //初始化
现在可以通过 proto 属性找到实例的原型对象,那么如果需要寻找实例的构造函数,就要使用constructor属性,这个属性会指向实例的构造函数
o.proto = o.constructor.prototype;
对于开发者来说,prototype是一个常用的属性,这个属性能帮助开发者很好的实现继承

但实际应用中,仍会存在一些多继承的需求或者对于一些类语言的开发人员更希望使用类的结构来实现继承
Mixin模式
mixin模式是开发者引入解决多重继承的方案
将多个继承对象上的属性拷贝到一个原型上
ES6的Class和Extends

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值