__proto__
__proto__的作用就是:当访问一个对象的属性时,如果该对象不存在该属性,就向上查找__proto__是否包含该属性,直到__proto__为null,即原型链顶端,还没找到该属性就是undefined。
(注:其实我不是很明白,为啥 {}.__proto__.__proto__是null, 而{}.__proto__.a是undefined。)
var obj = {};
// 这四个是一个东西
Object.prototype;
obj.__proto__;
(new Object()).__proto__;
(new Object()).__proto__.constructor.prototype;
使用Object.create()创建对象,可为一个对象指定原型
var a = {
count: 1
}
var b = Object.create(a)
b.__proto__ === a //true
Object.create()和this指针
const person = {
isHuman: false,
printIntroduction: function() {
console.log(this); //
}
};
const me = Object.create(person);
me.name = "Matthew";
me.isHuman = true;
const mm = Object.create(me);
mm.isHH = true;
mm.printIntroduction();
// printIntroduction中的this就是mm对象
constructor
proto js中所有的对象都有构造函数,因为本来所有的函数都可被用作构造函数new对象。每个对象的原型都是有一个构造函数和一个原型(如果不是原型链顶端),所有
function Func() { }
var f1 = new Func();
console.log(f1.__proto__);
// f1.__proto__包括属性coustructor和__proto__
// constructor就是构造函数
// __proto__就是{}.__proto__,因为所有对象都继承Object
prototype
只有方法才有prototype属性,对象的构造函数的prototype指向的是创建该对象的原型,所以
function Func() { }
var f1 = new Func();
f1.__proto__===f1.__proto__.constructor.prototype; // true
/* 所以这也就是为什么Object.prototype==={}.__proto__了,因为
对象可以用new Object()创建,所以Object就会对象原型的constructor。
那有new Function()吗?
*/
其他
因为Array的prototype有toString方法,Object的prototype也有toString方法,如果一个数组想调用Object的toString方法,就可以使用
var arr=[1,2,3]
arr.__proto__.__proto__.toString.call(arr);
Array.prototype.__proto__.toString.call(arr);
Object.prototype.toString.call(arr);
{}.toString.call(arr);
//可以为Array原型定义新方法
Array.prototype.toFixed=function(){
for(let i=0;i<this.length;i++){
this[i]=this[i].toFixed(2);
}
}
// arr =['1.00','2.00','3.00']
arr.toFixed();