Object形式
建立一个Object实例,再为其增加属性和要领。
这是建立自定义对象最简朴的体式格局。
1.建立对象
// 建立person对象
var person = new Object();
person.name = "Mike";
person.age = 20;
person.job = "student";
person.showName = function(){
console.log("this.name = " + this.name);
};
person.consThis = function(){
console.log("this = ");
console.log(this); // this指向person对象
console.log(this === person);
};
person.showName();
person.consThis();
输出如图:
2.视察下person.showName属性援用的函数
// person.showName援用的是一个匿名函数,其name属性为""
console.log("person.showName.name=");
console.log(person.showName.name);
console.log(person.showName.name === "")
console.log("-----分割线-----");
// showName援用的匿名函数的prototype属性指向其原型对象
console.log("person.showName.prototype=");
console.log(person.showName.prototype);
console.log(person.showName.prototype === Function.prototype); //不是Function组织函数的原型对象
console.log("-----分割线-----");
//其原型对象的constructor属性指向showName援用的匿名函数
console.log("person.showName.prototype.constructor=");
console.log(person.showName.prototype.constructor);
console.log("-----分割线-----");
// 此匿名函数的原型对象的__proto__属性指向Object组织函数的原型对象
console.log("person.showName.prototype.__proto__=");
console.log(person.showName.prototype.__proto__);
console.log(person.showName.prototype.__proto__ === Object.prototype);
console.log("-----分割线-----");
// showName援用的匿名函数的__proto__属性指向Function.prototype
console.log("person.showName.__proto__="); //showName援用的是一个匿名函数,匿名函数本质上是由组织函数Function天生的
console.log(person.showName.__proto__); //showName援用的是一个匿名函数,匿名函数本质上是由组织函数Function天生的
// 考证
console.log(person.showName.__proto__ === Function.prototype); //true
console.log("-----分割线-----");
showName
属性援用的匿名函数信息:
输出如图:
3.视察person对象涉及到的原型链
Object
组织函数的原型链
// prototype属性指向Object组织函数的原型对象
console.log("Object.prototype=");
console.log(Object.prototype);
// Object组织函数的原型对象的constructor属性指向其自身
console.log("Object.prototype.constructor=");
console.log(Object.prototype.constructor);
console.log("-----分割线-----");
//一切组织函数(内置及自定义)的__proto__属性都指向Function组织函数的原型对象
// __proto__指向Function组织函数的原型对象,即Function.prototype
console.log("Object.__proto__=");
console.log(Object.__proto__);
console.log(Object.__proto__ === Function.prototype);
console.log("-----分割线-----");
person
对象的原型链
// person是对象,非函数,所以没有prototype属性
console.log("person.prototype=");
console.log(person.prototype);
console.log("-----分割线-----");
// 一切对象的__proto__都指向其组织器的prototype
// person的__proto__属性指向组织函数的原型对象,即Object组织函数的原型对象
console.log("person.__proto__=");
console.log(person.__proto__);
// 考证
console.log(person.__proto__ === Object.prototype) //true
console.log("-----分割线-----");
组织函数的原型对象的范例
// Function.prototype的范例为function
console.log("typeof Function.prototype:");
console.log(typeof Function.prototype);
// 除了Function组织函数的原型对象为function,其他组织函数的原型对象范例为object
// Object.prototype的范例为object
console.log("typeof Object.prototype:");
console.log(typeof Object.prototype);
// Array.prototype的范例为object
console.log("typeof Array.prototype:");
console.log(typeof Array.prototype);
console.log("-----分割线-----");
Function组织函数的原型对象和Object组织函数的原型对象的关联
// Function.prototype.__proto指向Objcet.prototype
console.log("Function.prototype.__proto__=");
console.log(Function.prototype.__proto__);
// 考证
console.log(Function.prototype.__proto__ === Object.prototype); //true
// 这说明一切的组织器也都是一个一般JS对象,能够给组织器增加/删除属性等。同时它也继续了Object.prototype上的一切要领:toString、valueOf、hasOwnProperty等。
console.log("-----分割线-----");
// Object.prototype.__proto指向null
console.log("Object.prototype.__proto__=");
console.log(Object.prototype.__proto__);
// 原型链到顶了,为null。
原型剖析
一切组织器/函数的_ proto _都指向Function.prototype
一切对象的_ proto _都指向其组织器的prototype
除了Function组织函数的原型对象为function,其他组织函数的原型对象范例为object
一切的组织器也都是一个一般JS对象,能够给组织器增加/删除属性等。同时它也继续了Object.prototype上的一切要领:toString、valueOf、hasOwnProperty等。
person对象是由Object组织函数建立而成的,所以它的_ proto _指向Object.prototype
原型链图
person对象的原型链图:
person对象showName属性援用的匿名函数的原型链图: