JS建立对象形式及其对象原型链探讨(一):Object形式

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();

输出如图:
《JS建立对象形式及其对象原型链探讨(一):Object形式》

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属性援用的匿名函数信息:
《JS建立对象形式及其对象原型链探讨(一):Object形式》

输出如图:
《JS建立对象形式及其对象原型链探讨(一):Object形式》

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("-----分割线-----");

《JS建立对象形式及其对象原型链探讨(一):Object形式》

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("-----分割线-----");

《JS建立对象形式及其对象原型链探讨(一):Object形式》

组织函数的原型对象的范例

// 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("-----分割线-----");

《JS建立对象形式及其对象原型链探讨(一):Object形式》

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对象的原型链图:
《JS建立对象形式及其对象原型链探讨(一):Object形式》

person对象showName属性援用的匿名函数的原型链图:
《JS建立对象形式及其对象原型链探讨(一):Object形式》

    原文作者:small2
    原文地址: https://segmentfault.com/a/1190000004649497
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞