版权声明:进击的葱 https://blog.csdn.net/qlwangcong518/article/details/86316392
描述:
JS面向对象——类和原型
实现:
/*
*
* prototype 原型 基因
* 原型是有类当中创建,是由父代传入的
* 针对对象来说,这个原型就是自身根本原始属性
* 对象的__proto__ 他与类的prototype相同
* prototype就是类中对于自身基因的描绘
* __proto__对象实例化类获取初始属性和方法集,
* 因为__proto__是基于不同类别继承,就会形成链条形态,因此我们也称为原型链
*
* */
function 人类() {
// this是实例化的对象,因此这里就是在实例化的对象上添加了对象属性
this.头发="光头"
}
人类.prototype={
鼻子:1,
眼睛:2,
嘴巴:1,
耳朵:2,
说话:function () {
},
直立行走:function () {
this.腿=2;
this.脚=2;
},
思考:function () {
}
};
人类.prototype.constructor=人类;
/*
* 原型属性来自于类的初始化后的数据
*
*
* */
var 张晓明=new 人类();
张晓明.姓名="张晓明";
张晓明.工作="程序员";
张晓明.性别="男";
张晓明.直立行走();
张晓明.眼睛=1;
var 王倩=new 人类();
王倩.姓名="王倩";
王倩.工作="女程序员";
王倩.性别="女";
console.log(张晓明,王倩);
/*
* 原型属性是初始值,而且可以被继承,原型属性的初始值是不可以被修改的
* 对象属性是不同对象可以拥有不同的对象属性
* 但是如果是同一个类构造对象,他们必定原型属性完全相同
*
* */
// 他们两个对象都是同一个类构造出来的,因此对象的原型相同
console.log(张晓明.__proto__===王倩.__proto__);
console.log(张晓明.嘴巴);
// 对象中如果没有对象属性,就查找是否有这个对象原型属性,如果有就返回对象的原型属性值
张晓明.嘴巴=2;
//对象的属性被修改时,不能修改原型属性,因此就会添加同样的属性名的对象属性
// 下次调用该属性时,调用的是对象属性,而不再调用原型属性,除非使用delete删除该对象属性
delete 张晓明.眼睛;
console.log(张晓明.眼睛);
// 不允许修改对象的原型属性
// 张晓明.__proto__.嘴巴=8;
console.log(new 张晓明.constructor());
// 对象的属性是否是这个类的原型属性判断,返回true或false
console.log( 人类.prototype.isPrototypeOf(张晓明));
console.log( 王倩.__proto__.isPrototypeOf(张晓明));
console.log("----------------------------------------");
// 判断对象中是否有这个对象属性,原型属性返回为false
// console.log(王倩.hasOwnProperty("姓名"))
// 判断对象中是否有这个对象属性,包括原型属性和对象属性
// console.log("耳朵" in 王倩)
// 判断当前属性是否是对象的可枚举属性,原型是不可枚举的,
// 因此原型属性也不属性对象的可枚举属性
console.log(王倩.propertyIsEnumerable("耳朵"));