Javascript面向对象——创建对象、构造函数的原型

其实:JavaScript中的创建类,就是创建一个构造函数,在创建对象时用到new这个关键字,

一、创建对象

1.函数创建对象

function creatObj(name,age){
//手动创建一个对象
var obj={} //为对象添加属性
obj.name=name
obj.age=age
obj.sayHi=function(){
console.log("hello world!")
}
//返回对象
return obj
} //调用方法创建不同对象
var obj1=creatObj("小明",18)
var obj2=creatObj("小花",20)

2.自定义构造函数创建对象

构造函数使用

1、构造函数和普通函数没有区别,只是在调用是和new一起使用

2、书写构造函数时,函数首字母大写

​ =>当看到首字母大写时就知道要用new关节字去调用

3、调用时要用new关键字

​ =>如果没有就不会自动创建对象、不会自动返回对象,也不能用this

function CreatObj(name,age){     //构造函数首字母大写
//自动创建一个对象 //为对象添加属性
this.name=name //this代表了指向调用的对象
this.age=age
this.什么=什么
this.obj.sayHi=function(){
console.log("hello world!")
}
//自动返回对象
} //调用方法创建不同对象
var obj1=new creatObj("小明",18) //加了一个new
var obj2=new creatObj("小花",20)

二、构造函数的原型(prototype)

定义:每一个函数天生自带的属性,叫做prototype,是一个对象

=>既然prototype是一个对象,我们就可以使用操作对象的语法,向里面添加内容

作用:当函数里面没有想调用的属性或方法时,就会去函数的原型里面去找。

不合理性:如果把方法直接写在函数体里面时(如上一个例子所示),每创建一个对象时都会从新创建一个方法。(造成资源浪费)

解决办法:使用函数原型,如果把方法放在原型里面后,不同对象创建的方法都是同一个方法。

//格式:构造函数.prototype.方法名=function(){    }

//为Creatobj的原型添加方法
Creatobj.prototype.sayHi=function(){
consle.log("hello world!")
} function Creatobj(name,age){ //构造函数首字母大写
//自动创建一个对象 //为对象添加属性
this.name=name //this代表了指向调用的对象
this.age=age
this.什么=什么
//自动返回对象
} //调用方法创建不同对象
var obj1=new creatObj("小明",18) //加了一个new
var obj2=new creatObj("小花",20) //调用Creatobj里原型的方法
obj1.sayHi() //可以正常调用

1.对象自带的方法(__proto__)

概念:每个对象天生自带属性__proto__,指向构造函数是prototype,当访问对象成员时先在自己身上找不到再去找__proto__

//构造函数
function Person(){ } //给Person的原型赋值
Person.prototype.a=100
Person.prototype.say=function(){
console.log("hello")
} //创建两个对象
var p1=new Person()
var p2=new Person() //判断对象的里
console.log(p1.__proto__===Person.prototype)
console.log(p2.__proto__===Person.prototype)
//结果都为true, //说明所有对象使用同一个原型

2.原型链

原型链概念:

1、用__proto__ 串联起来的对象链状结构

2、每一个对象类型都有一个属于自己的原型链

3、作用:为了访问对象成员

访问机制

当你需要访问对象的成员的时候

首先在自己身上查找,如果有直接使用

如果没有,会自动去__proto__ 上查找

如果还没有,会再去__proto__ 上查找

直到objiect.prototype都没有,那么返回undefined

//构造函数
function Person(){
} //给Person的原型赋值
Person.prototype.a=100
Person.prototype.say=function(){
console.log("hello")
} //创建两个对象
var p1=new Person()
var p2=new Person()

看上面代码回答问题

问题1:实例对象的 __proto__ 指向谁?

=>指向所属构造函数的原型prototype

=>p1 所属的构造函数是Person

=>p1. __proto__ 指向Person的prototype

问题2:Person.prototype的 __proto__ 指向谁?

=>Person.prototype所属的构造函数是谁?

=>Person.prototype是个对象数据类型(Object)

=>在JS里所有的Object数据类型都是属于Object这个内置构造函数的

=>Person.prototype的 __proto__ 指向Object.prototype

问题3:Person的 __proto__ 指向谁的?

=>Person是个函数,函数本身就是一个对象,就会有 __proto__

=>在JS里所有的函数都是属于Function这个内置构造函数的实例

=>Person. __proto__的 指向Function.prototype

问题4:Objiect.prototype的 __proto__ 指向谁的?

=>Objiect.prototype是个对象数据类型,所有的对象都是属于Object这个内置构造函数的。

=>注意:Objiect.prototype在JS中是顶级原型,是没有 __proto__

=>Objiect.prototype的 __proto__ 指向null

问题5:Objiect的 __proto__ 指向谁的?

=>Objiect是个内置构造函数,同时是一个函数,也是一个对象

=>在JS里所有的函数都是属于Function这个内置构造函数的实例

=>Objiect的 __proto__ 指向Function.prototype

问题6:Function.prototype的 __proto__ 指向谁的?

=>Function.prototype是对象数据类型

=>在JS里所有的对象都是属于Object这个内置构造函数的实例

=>Function.prototype的 __proto__ 指向Object.prototype

问题7:Function的 __proto__ 指向谁的?

=>Function是个内置构造函数,同时是一个函数,也是一个对象

=>在JS里所有的函数都是属于Function这个内置构造函数的实例

=>Fanction 自己是自己的构造函数

=>Fanction 自己是自己的实例对象

=>Function的 __proto__ 指向Function

Javascript面向对象——创建对象、构造函数的原型的更多相关文章

  1. JavaScript 类、构造函数、原型

    类.构造函数.原型  :本质均为函数 利用的原理是:词法作用域,调用对象及作用域链  闭包  属性查找方式    设计和new运算符一起使用的函数叫做构造函数. 构造函数的工作:初始化一个新创建的对象 ...

  2. JavaScript中的构造函数和原型!

    JavaScript中的原型! 原型的内容是涉及到JavaScript中的构造函数的 每一个构造函数都有一个原型对象!prototype 他的作用是 共享方法!还可以扩展内置对象[对原来的内置对象进行 ...

  3. javascript中的构造函数和原型及原型链

    纯属个人理解,有错误的地方希望大牛指出,以免误人子弟 1.构造函数: 构造函数的作用 : 初始化由new创建出来的对象    new 的作用: 创建对象(空对象) new 后面跟的是函数调用,使用ne ...

  4. Javascript函数、构造函数、原型、类和对象

    函数 函数是JavaScript中特殊的对象,对函数执行typeof运算会返回字符串"function",因为函数也是对象,他们可以拥有属性和方法. 静态方法 函数在JS中定义了类 ...

  5. Javascript深入理解构造函数和原型对象

    1.在典型的oop的语言中,如java,都存在类的概念,类就是对象的模板,对象就是类的实例.但在js中不存在类的概念,js不是基于类,而是通过构造函数(constructor)和原型链(propoty ...

  6. JavaScript面向对象:创建对象

    1.初级创建对象 var oCar=new Object; oCar.color='red'; oCar.door=4; oCar.map=3; oCar.showColor=function () ...

  7. 「JavaScript面向对象编程指南」原型

    在 JS 中,函数本身也是一个包含了方法(如apply和call)和属性(如length和constructor)的对象,而prototype也是函数对象的一个属性 function f(){} f. ...

  8. JavaScript面向对象编程指南(五) 原型

    第5章 原型 5.1 原型属性 function f(a,b){ return a*b; }; // length 属性 f.length; // constructor 构造属性 f.constru ...

  9. JavaScript 实例、构造函数、原型对象关系图

    详细介绍:深入理解javascript原型和闭包(5)——instanceof 图片来源:https://www.ibm.com/developerworks/cn/web/1306_jiangjj_ ...

随机推荐

  1. CF53C Little Frog 题解

    Content 有一只小青蛙想游历 \(n\) 块土堆,它现在在 \(1\) 号土堆上,每次可以跳跃任意距离到达另外的一个土堆.它想让每次跳跃的距离都不相等,试找到这样的一个方案. 数据范围:\(1\ ...

  2. CF106A Card Game 题解

    Content 一种纸牌游戏有许多张卡牌,每张卡牌有一个套装(S,H,D和 C)和一个等级(按升序排列6,7,8,9,T, J,Q,K,A). 规定以下情况卡牌 A 才能赢卡牌 B: A 有王牌套装, ...

  3. Clusternet 成为首批通过工信部开源成熟度评估项目!!!

    Clusternet 作为首批项目参与了<信息技术 开源 开源项目评估模型参考架构>测评,并成为通过评估的四个项目之一.<信息技术 开源 开源项目评估模型参考架构>由国防科技大 ...

  4. 在react项目中使用require引入图片不生效

    如果使用create-react-app和require导入图像,require返回一个ES模块而不是字符串.这是因为在file-loader中,esModule选项是默认启用的. 用以下方式之一导入 ...

  5. JAVA中JDK1.8的LocalDateTime日期类的操作方法

    LocalDateTime与Date相互转换参考:https://www.cnblogs.com/pxblog/p/13745972.html 关键类 Instant:瞬时时间. LocalDate: ...

  6. Android NDK开发篇:Java与原生代码通信(原生方法声明与定义与数据类型)

    Java与原生代码通信涉及到原生方法声明与定义.数据类型.引用数据类型操作.NIO操作.访问域.异常处理.原生线程 1.原生方法声明与定义 关于原生方法的声明与定义在上一篇已经讲一点了,这次详细分析一 ...

  7. 【LeetCode】922. Sort Array By Parity II 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 使用奇偶数组 排序 奇偶数位置变量 日期 题目地址: ...

  8. 【LeetCode】802. Find Eventual Safe States 解题报告(Python)

    [LeetCode]802. Find Eventual Safe States 解题报告(Python) 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemi ...

  9. Masked Gradient-Based Causal Structure Learning

    目录 概 主要内容 最终的目标 代码 Ng I., Fang Z., Zhu S., Chen Z. and Wang J. Masked Gradient-Based Causal Structur ...

  10. Dubbo为什么要用Go重写?

    先说两句 我常常在散步时思考很多技术上的「为什么问题」,有时一个问题会想很久,直到问题的每一个点都能说服自己时,才算完结.于是想把这些思考记录下来,形成文章,可以当做一个新的系列.这些文章中你可能看不 ...