Javascript面向对象——创建对象、构造函数的原型
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面向对象——创建对象、构造函数的原型的更多相关文章
- JavaScript 类、构造函数、原型
类.构造函数.原型 :本质均为函数 利用的原理是:词法作用域,调用对象及作用域链 闭包 属性查找方式 设计和new运算符一起使用的函数叫做构造函数. 构造函数的工作:初始化一个新创建的对象 ...
- JavaScript中的构造函数和原型!
JavaScript中的原型! 原型的内容是涉及到JavaScript中的构造函数的 每一个构造函数都有一个原型对象!prototype 他的作用是 共享方法!还可以扩展内置对象[对原来的内置对象进行 ...
- javascript中的构造函数和原型及原型链
纯属个人理解,有错误的地方希望大牛指出,以免误人子弟 1.构造函数: 构造函数的作用 : 初始化由new创建出来的对象 new 的作用: 创建对象(空对象) new 后面跟的是函数调用,使用ne ...
- Javascript函数、构造函数、原型、类和对象
函数 函数是JavaScript中特殊的对象,对函数执行typeof运算会返回字符串"function",因为函数也是对象,他们可以拥有属性和方法. 静态方法 函数在JS中定义了类 ...
- Javascript深入理解构造函数和原型对象
1.在典型的oop的语言中,如java,都存在类的概念,类就是对象的模板,对象就是类的实例.但在js中不存在类的概念,js不是基于类,而是通过构造函数(constructor)和原型链(propoty ...
- JavaScript面向对象:创建对象
1.初级创建对象 var oCar=new Object; oCar.color='red'; oCar.door=4; oCar.map=3; oCar.showColor=function () ...
- 「JavaScript面向对象编程指南」原型
在 JS 中,函数本身也是一个包含了方法(如apply和call)和属性(如length和constructor)的对象,而prototype也是函数对象的一个属性 function f(){} f. ...
- JavaScript面向对象编程指南(五) 原型
第5章 原型 5.1 原型属性 function f(a,b){ return a*b; }; // length 属性 f.length; // constructor 构造属性 f.constru ...
- JavaScript 实例、构造函数、原型对象关系图
详细介绍:深入理解javascript原型和闭包(5)——instanceof 图片来源:https://www.ibm.com/developerworks/cn/web/1306_jiangjj_ ...
随机推荐
- IIS部署,发布网站
一.IIS部署 1.打开控制面板,选择 '程序' 2.程序和功能下,选择打开或关闭Windows功能 3.等待加载,选择Internet信息服务,勾选如下选项 在弹出的"windows功能& ...
- 【死磕Java并发】-----内存模型之happens-before
在上篇博客([死磕Java并发]-----深入分析volatile的实现原理)LZ提到过由于存在线程本地内存和主内存的原因,再加上重排序,会导致多线程环境下存在可见性的问题.那么我们正确使用同步.锁的 ...
- vscode 快速入门
vscode 快速入门 本篇主要讲解 vscode 使用中的一些经验: 配置 vue 开发环境 - Vetur+ESLint+Prettier 代码片段的使用 常用插件 如何完全卸载 vscode 通 ...
- Android 控件使用教程(一)—— ListView 展示图片
起因 最近在看一些开源项目时,经常看到了RecyclerView,这是安卓5.0推出的一个新的控件,可以代替传统的ListView,已经这么久了还没有用过,所以决定试一试.另外在做这个的工程中看到了另 ...
- Balancing Act(poj1655)
Balancing Act Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 12703 Accepted: 5403 De ...
- World is Exploding(hdu5792)
World is Exploding Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Other ...
- The Longest Straight(FZUoj2216)
Problem 2216 The Longest Straight Accept: 82 Submit: 203Time Limit: 1000 mSec Memory Limit : ...
- Certified Robustness to Adversarial Examples with Differential Privacy
目录 概 主要内容 Differential Privacy insensitivity Lemma1 Proposition1 如何令网络为-DP in practice Lecuyer M, At ...
- iOS提交AppStore审核时:提示有其他支付并隐藏功能被拒的处理办法
背景提示:数字类产品(比如购买会员等不需要配送实物的商品),Apple规定必须使用苹果IAP应用内支付,给Apple分成30%.打包的时候不要勾选微信或支付宝等其他支付方式.如果你提交的包里包含了微信 ...
- 编写Java程序,使用Swing事件处理机制实现用户登录和英雄信息显示
返回本章节 返回作业目录 需求说明: 使用Swing事件处理机制实现用户登录和英雄信息显示 实现思路: 创建LoginView类,该类用于显示登录界面,为登录按钮添加ActionListener事件, ...