1.普通函数找this
创建实例及创建实例的值比较,实例检测是否包含私有属性
function Fn() {
// this.xxx=xxx 都是给当前实例设置的“私有”属性
this.x = 100;
this.say = function () {};
}
Fn(); //=>this:window
let f1 = new Fn(); //=>this:当前Fn这个类的实例f1
let f2 = new Fn();
//=>获取f1实例对象私有属性x的值 === 获取f2实例对象私有属性x的值
console.log(f1.x === f2.x); //=>true
//因为f1和f2的堆不是同一个堆
console.log(f1.say === f2.say); //=>false
//实例检测是否包含私有属性名:hasOwnProperty
console.log(f1.hasOwnProperty('say')); //=>true
2.每个数组都是Array类的实例
-
1.每一个对象都是Object类的实例
-
2.每一个数字都是Number类的实例
/* 每一个数组都是Array这个内置数组类的实例 */ let arr1 = [10, 20]; let arr2 = [30, 40];
console.log(arr1 instanceof Array); //=>true console.log(arr1.hasOwnProperty('push')); //=>false console.log(arr1.push === arr2.push); //=>true arr1.push(100); //=>对象.属性 说明PUSH是ARR1的一个属性, //而且是公有属性(其它数组中常用的方法也都是数组实例的公有属性)
3.原型链
- 1.每一个函数都天生具备一个属性:prototype(原型),函数的prototype(原型)的属性值是一个对象(浏览器默认会给其开辟一个堆内存) =>“原型对象上所存储的属性和方法,就是供当前类实例所调用的公有的属性和方法”
- 普通函数
- 类也是函数类型的值
- 2.在类的prototype原型对象中,默认存在一个内置的属性:constructor(构造函数),属性值就是当前类(函数)本身,所以我们也把类称为构造函数
- 3.每一个对象都天生具备一个属性:proto(原型链),属性值是当前实例(对象)所属类的prototype原型
- 1)对象数据类型值
- 普通对象
- 数组对象
- 正则对象
- 2)实例也是对象类型值(除基本值外)
- 3)类的prototype原型属性值也是对象
- 4)函数也具备对象的特征(它有一重身份就是对象类型)
- 5)所有的对象数据类型值,都是内置类Object的一个实例
4.原型this练习
function Fn() {
this.x = 100;
this.y = 200;
this.getX = function () {
console.log(this.x);
}
}
Fn.prototype.getX = function () {
console.log(this.x);
};
Fn.prototype.getY = function () {
console.log(this.y);
};
let f1 = new Fn;
let f2 = new Fn;
console.log(f1.getX === f2.getX);
console.log(f1.getY === f2.getY);
console.log(f1.__proto__.getY === Fn.prototype.getY);
console.log(f1.__proto__.getX === f2.getX);
console.log(f1.getX === Fn.prototype.getX);
console.log(f1.constructor);
console.log(Fn.prototype.__proto__.constructor);
f1.getX();
f1.__proto__.getX();
f2.getY();
Fn.prototype.getY();
5.原型练习
function Fn(num) {
this.x = this.y = num;
}
Fn.prototype.AA = 100;
Fn.prototype = {
x: 20,
sum: function () {
console.log(this.x + this.y);
}
};
let f = new Fn(10);
console.log(f.sum === Fn.prototype.sum);
f.sum();
Fn.prototype.sum();
console.log(f.constructor);