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

news/2024/7/3 12:26:19 标签: js, javascript, prototype, , 多态

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

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

一、创建对象

1.函数创建对象

js">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

js">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是一个对象,我们就可以使用操作对象的语法,向里面添加内容

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

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

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

js">//格式:构造函数.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__

js">//构造函数
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

js">//构造函数
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


http://www.niftyadmin.cn/n/1508182.html

相关文章

jq取第一个子元素为select_最大连续子序列和(算法)

2019/5/2修改最近看到的一道编程题目:有一个数组,如1, -5, 8, 3, -4, 15, -8,查找其中连续和最大的相邻串的值。在本例中,…

Javascript实现让小图片一直跟着鼠标移动

Javascript实现让小图片一直跟着鼠标移动实例 注意&#xff1a;图片可能加载不出来&#xff0c;注意更换 <!doctype html> <html> <head> <meta charset"utf-8"> <title>永恒之月</title> <style> body {margin: 0;paddin…

python打印实心三角形_Python全栈之路-8-类与对象

本文代码地址​github.com面向对象概念类(class): 用来描述具有相同的属性和方法的对象的集合&#xff0c;它定义了该集合中每个对象所共有的属性和方法&#xff0c;对象是类的实例方法: 类中定义的函数类变量: 类变量是类的所有对象共有的属性&#xff0c;它不是某个具体对象特…

Javascript——ES6( ECMAScript 6.0)语法

ES6( ECMAScript 6.0)语法 一、let/const与var的区别 var 会进行预解析&#xff0c;let/const不会 var可以声明两个重名的变量&#xff0c;let/const不能 var没有块级作用域&#xff0c;let/const有块级作用域 二、箭头函数 1.普通函数 //xxx.onclickfunction(a10,b20){ } 可以…

lgg6可以root的版本_Jenkins+maven+gitlab+Tomcat自动部署版本更新及回滚

该博文实现效果&#xff1a;结合mavengitlab&#xff0c;可以使用Jenkins对不同环境(测试及线上环境)的tomcat服务器实现版本的迭代更新及版本回滚操作&#xff0c;部署完成后&#xff0c;只需点击几下&#xff0c;即可实现。一、环境准备系统 IP 主机名 运行服务Centos7.3 192…

JavaWeb中的四大作用域对象

JavaWeb中的四大作用域对象 一、page对象 有效范围pageContext&#xff1a;只在一个页面中保存属性&#xff0c;跳转后无效 作用&#xff1a;代表jsp中 二、request对象 作用&#xff1a;提供对请求数据的访问&#xff0c;提供用于加入特定请求数据访问 有效范围&#xf…

光学定位与追踪技术_激光焊接技术

来源&#xff1a;焊接切割联盟激光器的优势与传统的电弧焊接工艺相比&#xff0c;激光束接缝有很多好处&#xff1a;小区域内选择性的能量应用&#xff1a;降低热应力和减小热影响区&#xff0c;极低的畸变。接合缝窄、表面平滑&#xff1a;降低甚至消灭再加工。高强度与低焊接…

Javaweb中的JDBC使用步骤

Javaweb中的JDBC使用步骤 1、导入jar包 2、注册驱动 Class.forName("com.jdbc.mysql.Driver"); //注册mysql驱动3、获取数据库连接 String url"JDBC:mysql://127.0.0.1:3306/databaseName"; //“JDBC:mysql://ip地址:端口号:数据库名” String us…