今天又是一个美好的一天耶 ! ✌
对象:
一组属性的无序集合,由key和value组成(相比数组来说,提升了查找速度和数据传输速度)
如果我们想对某个属性精准的操作控制,可以使用属性描述符 object.defineProperty
创建对象的有两种方式,一种是字面量,一种通过 new 关键字(构造函数)创建
构造函数:
js 中每个 对象
都一个内置属性 prototype(proto), 当我们通过引用对象的属性key 来获取一个value值时,他会触发get操作,这个操作会现在自身找是否有对应属性,如果没有就会通过这个内置属性 prototype 指向的对象上找 (这个内置属性只能用来查找)
js 中每个函数
有一个属性 prototype ,
但我们通过new 的方式创建出来的对象,他的prototype会指向他构造函数的内置属性【prototype】
function Pro(){
}
let obj= new Pro()
obj={}
obj.__proto__ = Pro.prototype
constructor 属性:
function Pro(){
}
let obj= new Pro()
console.log( obj._proto_.constructor )
console.log( Pro.prototype.constructor )
答 : js 中每个函数都有一个原型属性 prototype, js 中每个对象都有一个内置原型属性 prototype, 当通过new出来的对象他的内置属性prototype(proto)会指向该构造函数的prototype, 原型的优势就是:可以将公共的函数方法放在原型上,供new出来的对象共享
答 : 如果我们想获取一个对象的某个属性时,会先在本身找,找不到会他的原型上找,因为类似于一个链条,所以把这种查找方式称为原型链,原型链的最顶层的原型对象是 object的原型对象
封装:
可以将属性和方法封装到一个类中,这个过程叫做封装继承:
通过new构造出来的对象,在执行过程中其实每次都会开辟新的内存空间创建函数执行上下文, 特别费内存,可以将公共的函数方法放在原型上,让所有new出来的对象共享多态:
不同对象在执行时表现的不同状态面向对象设计 OOD
1. 原型、原型链的继承
构造函数二
function Parent(msg) {
this.msg = msg;
}
Parent.prototype.init = function () {
console.log("哈哈哈哈");
};
构造函数一
function Child(msg) {
}
Child.prototype = new Parent() // 修改原型链
Parent.prototype = Child.prototype; // 修改原型
2. 借用构造函数继承
function Parent(msg) {
this.msg = msg;
this.show = function () {
console.log(this.msg);
};
}
Parent.prototype.init = function () {
console.log("哈哈哈哈");
};
function Child(msg) {
Parent.call(this, msg);
}
const C = new Child("hi");
C.show(); // c 就可以使用p的构造函数内的方法,
C.init(); // 但是他不能继承原型上的属性和方法 !!! 这就是继承的特点,
3. es6提供的继承方式
// 定义 class 而不是之前的 function,
// 注意 属性和方法的写法
// 通过 extends 继承,可以使用 super 传递给被继承的
// 这是官方封装好的
class Parent {
constructor(msg) {
this.msg = msg;
}
show() {
console.log(this.msg);
}
}
class Child extends Parent {
constructor(m) {
super(m);
}
}
const P = new Parent("hello");
const C = new Child("hi");
你学废了吗?
谢谢阅读,谢谢点赞并关注(没错我就要道德绑架你!)
原型链的弊端: