原型链 原型图
对于原型图 有三句话
每一个函数(每个类)都有一个 默认的 prototype 属性 指向自己的原型对象
每一个实例(对象) 都有一个 _proto_ 的属性 指向所属类的原型对象
每一个 默认的 原型对象 上 都有一个 constructor 属性 指向 对应的 构造函数本身
如果默认的原型对象 被改变了地址,又没有加这个constructor属性,那么更改的原型对象是没有constructor这个属性的
每个类都是函数
var f = () =>{ console.log(1) };
console.dir(f);//本身箭头函数 没法用构造函数方式去创造实例,所以箭头函数里没有默认的 prototype
function Person (name, age) {
this.name = name;
this.age = age;
}
Person.prototype.eat = function () {
console.log(1)
}
var p1 = new Person('xiaoming', 12);
var p2 = Person('xiaohong', 13);
//普通函数执行的过程:开辟一个作用域,形参赋值,变量提升 代码从上到下执行
//new 执行时,开辟一个作用域,形参赋值,变量提升 开辟一个堆内存 把this指向改成这个堆内存 然后代码从上到下执行
私有属性
// in 是用来查看 某个属性 是否属于某个对象;换句话说,就是该对象是否能调用到该属性,就算属性是其类的原型里的属性,也是可以的
//所以 in 不能判断出这个属性是否是自己私有的
// obj.hasOwnProperty('xxx') 这个属性可以用来查看 xxx 是否是obj的私有属性
//hasOwnProperty 是Object 这个基类原型上的方法,所以 任何数据类型(除了null undefined)都可以用这个方法,都可以调用
var ary = [1,2,3];
ary.qqq = 123;
for (var k in ary) {
console.log(typeof k);
console.log(ary[k]);//这里,能够把ary这个数组的属性qqq的值输出,不符合我们的需求,我们是只想输出 里面的项 所以一般 数组不用 for in 循环
}
//自己封装一个 hasPubProperty 用来查看某个属性是否是某个对象的共有属性
//用法等同于 has OwnProperty
// function hasPubProperty (m) {
// (this.hasOwnProperty('m'))?false:true
// }
// Object.prototype.hasPubProperty = hasPubPorperty;
Object.prototype.hasPubProperty = function (key) {
// this是我们要用的obj;
//要去判断 key 是不是 this 的一个共有属性;
//首先 是它的属性 然后 不是它的私有属性
return (key in this && !this.hasOwnProperty(key))
}
constructor instanceof
//为什么用constructor能查询数据类型?因为数据所属类的原型里有constructor这个属性,指向的是类,所以这个的机制是基于原型图的
var n = 22;
n.constructor;// 就是去看它的所属类
//原型重构
function Person (name, age) {
this.name = name;
this.age = age;
}
var obj = {
constructor:Person,
eat () {},
}
Person.prototype = obj//原型重构 就是直接把原型改了,要注意的就是把constructor补全,因为默认的prototype 是有constructor的
var ary = [];
var n = 10;
var m = new Number(10);
console.log(ary instanceof Array);//true
console.log(ary instanceof Object) //true
console.log(ary instanceof Number) //false
console.log(n instanceof Number) //false
console.log(m instanceof Number) //true
//xxx instanceof YYY :查看xxx到 基类的原型链上是否存在 YYY的身影
//存在 ,结果就是 true ;不存在,结果就是false
//基本数据类型 instanceof 谁 ;都会是 false