js原型原型链

一. 普通对象与函数对象

JavaScript 中,万物皆对象!但对象也是有区别的。分为普通对象和函数对象,Object 、Function 是 JS 自带的函数对象。

o1 o2 o3 为普通对象,f1 f2 f3 为函数对象  (凡是通过 new Function() 创建的对象都是函数对象,其他的都是普通对象)

var o1 = {};
var o2 =new Object();
var o3 = new f1();

function f1(){};
var f2 = function(){};
var f3 = new Function('str','console.log(str)');

console.log(typeof Object); //function
console.log(typeof Function); //function  

console.log(typeof f1); //function
console.log(typeof f2); //function
console.log(typeof f3); //function   

console.log(typeof o1); //object
console.log(typeof o2); //object
console.log(typeof o3); //object

构造函数(扩展)

1.var a = {} 其实是 var a = new Object()的语法糖  (a 的构造函数是 Object 函数)

2.var a = [] 其实是 var a = new Array()的语法糖    (a 的构造函数是 Array 函数)

3.function Foo(){...}其实是 var Foo = new Function(...)     (Foo 的构造函数是 Function 函数)

二. 构造函数

function Person(name, age, job) {
 this.name = name;
 this.age = age;
 this.job = job;
 this.sayName = function() { alert(this.name) }
}
var person1 = new Person('Zaxlct', 28, 'Software Engineer');
var person2 = new Person('Mick', 23, 'Doctor');

person1 和 person2 都是 Person 的实例,两个实例都有一个 constructor (构造函数)属性,该属性(是一个指针)指向 Person,其层级如下:

所以可以得出: console.log(person1.constructor == Person); //true
 console.log(person2.constructor == Person); //true

person1 和 person2 都是 构造函数 Person 的实例
实例的构造函数属性(constructor)指向构造函数

三. 原型对象

在 JavaScript 中,每当定义一个对象(函数也是对象)时候,对象中都会包含一些预定义的属性。其中每个函数对象都有一个prototype 属性(只有函数才有prototype,实例只有__proto__),这个属性指向函数的原型对象。

注意:

1.只有函数才有prototype,实例(new Animal)只有__proto__

2.函数是Function的实例,函数的prototype是Object的实例

3.Function.__proto__ == Function.prototype

4.Object.prototype.__proto__ == null

比如:

function Animal() {}

const a = new Animal()

1.     a.__proto__ == Animal.prototype

2.    Animal.prototype.constructor == Animal 

3.    只要用function声明的Animal,就会带一个prototype属性,而Animal是Function的实例 【Animal instanceof Function 为true】,Animal.__proto__ == Function.prototype

4.    Animal.prototype是Animal上一个属性,是一个对象属性,它【Animal.prototype instanceof Object 为true】,Animal.prototype.__proto__ == Object.prototype

四. 原型对象继承

当我们声明一个function关键字的方法时,会为这个方法添加一个prototype属性,指向默认的原型对象,并且此prototype的constructor属性也指向方法对象

function Person() {
}
var person = new Person();Person 就是一个构造函数,我们使用 new 创建了一个实例对象 person

第一:每个函数都有一个 prototype 属性每一个JavaScript对象(null除外)在创建的时候就会与之关联另一个对象,这个对象就是我们所说的原型,每一个对象都会从原型"继承"属性。
每一个JavaScript对象(除了 null )都具有的一个属性,叫proto,这个属性会指向该对象的原型
每个原型都有一个 constructor 属性指向关联的构造函数 实例原型指向构造函数
最终原型链

1)什么是原型链?

    原型链的核心就是依赖对象的_proto_的指向,当自身不存在的属性时,就一层层的扒出创建对象的构造函数,直至到Object时,就没有_proto_指向了。

2)如何分析原型链?

    因为_proto_实质找的是prototype,所以我们只要找这个链条上的构造函数的prototype。其中Object.prototype是没有_proto_属性的,它==null。

最简单的原型链分析

function Person(name){
  this.name = name;
}
var p = new Person();
//p ---> Person.prototype --->Object.prototype---->null

 
(0)

相关推荐

  • 万字长文深度剖析面向对象的javascript

    简介 本将会深入讲解面向对象在javascript中的应用,并详细介绍三种对象的生成方式:构造函数,原型链,类. 什么是对象 虽然说程序员不缺对象,随时随地都可以new一个出来,但是在程序的世界中,对 ...

  • 创建对象及原型

    一.使用Object构造函数或对象字面量创建对象 缺点:使用同一个接口创建对象,会产生大量的重复性代码. 解决方法:使用工厂模式创建对象. 1 //构造函数2 let obj1 = new Objec ...

  • [js] 第108天 请描述下js的原型和原型链的理解以及它们之间的关系

    今日试题: 请描述下js的原型和原型链的理解以及它们之间的关系 此开源项目四大宗旨:勤思考,多动手,善总结,能坚持 <论语>,曾子曰:"吾日三省吾身"(我每天多次反省自 ...

  • (4条消息) 阐述JS中原型链及prototype和

    在开始先给出我在知乎上看到的一张图,可以帮助理解: 如果现在你还不能很好的理解这副图的意思,那请继续往下看. 一.prototype和 _proto_ 的概念 prototype是函数的一个属性(每个 ...

  • JS的原型和继承

    __proto__ 除null和undefined,JS中的所有数据类型都有这个属性: 它表示当我们访问一个对象的某个属性时,如果该对象自身不存在该属性, 就从它的__proto__属性上继续查找,以 ...

  • 干货 | 快速读懂 JS 原型链

    OSC开源社区 昨天 以下文章来源于前端日志 ,作者前端日志 前端日志前端一二线大厂日常工作.技术分享.实战总结. 最近参加了公司内部技术分享,分享同学提到了 Js 原型链的问题,并从 V8 的视角展 ...

  • 最详尽的 JS 原型与原型链终极详解

    最详尽的 JS 原型与原型链终极详解 一. 普通对象与函数对象 JavaScript 中,万物皆对象!但对象也是有区别的.分为普通对象和函数对象,Object ,Function 是 JS 自带的函数 ...

  • JS基础知识理解之一: 原型链

    js原型链 js原型链是什么? 在思考这个问题的时候,我们可能会有很多概念,[链子].[祖先].[father] 要理解 原型链 首先要理解 原型 对象的属性 [[Prototype]] 都指向其他对 ...

  • JS原型链常见面试题分析

    构造函数: function Foo(name,age){ this.name=name; this.age=age; this.class='class-1'; } var f=new Foo('c ...

  • [js] 第109天 请描述下什么是原型模式?它主要运用在哪些场景?

    今日试题: 请描述下什么是原型模式?它主要运用在哪些场景? 此开源项目四大宗旨:勤思考,多动手,善总结,能坚持 <论语>,曾子曰:"吾日三省吾身"(我每天多次反省自己) ...

  • 前端面试题整理——原型和原型链

    Class的使用: // 父类 class People { constructor(name) { this.name = name } eat() { console.log(`${this.na ...