js中每一个构造函数都有一个prototype的属性,prototype指向一个原型对象,而这个对象的属性和方法都会被构造函数的实例所继承,因此,需要一些共享的属性和方法可以写在构造函数的原型中

1  用prototype属性可以向构造函数添加可继承的属性和方法,

注意constructor属性指向prototype对象所在的构造函数,方法放在prototype中,属性放在构造函数里,

实例,原型对象,构造函数,三者之间的关系:

实例有__proto__属性指向原型对象

原型对象有constructor指针指向构造函数

构造函数又有prototype属性指向原型对象

    <script>
function Person(name,age){
this.name = name;
this.age = age;
}
Person.prototype = {
constructor: Person,
sayName: function(){
console.log(this.name);
}
}
var p = new Person('xxx',22);
p.sayName();//'xxx'
console.log(p.age);//
</script>

2  一个同名属性在实例和prototype对象中存在时,构造函数的实例采用构造函数里的this属性,查找优先级类似于:实例>原型对象

    <script>
function Person(age){
this.age = age;//创建实例时赋给实例的属性
}
Person.prototype = {
constructor: Person,
name: 'xxx',
age: 22,
sayName: function(){
console.log(this.name);
}
}
var p = new Person(233);
console.log(p.age);//
p.age = 333;
console.log(p.age);//
</script>

3 原型的继承

    <script>
function Person(){
this.age = 233;//创建实例时赋给实例的属性
}
Person.prototype = {
constructor: Person,
name: 'xxx',
age: 22,
sayName: function(){
console.log(this.name);
}
}
var p = new Person();
console.log(p.age);//
p.age = 333;
console.log(p.age);//
function Student(){ }
Student.prototype = new Person();//继承
var s = new Student();
console.log(s.name);//'xxx'
s.name = 'qqq';
console.log(s.name);//'qqq'
</script>

4 原型链的概念(修改于2019-11-13 09:41:30)

从对象的__proto__一级一级往上找

    <script>
class Person{
constructor(name,age){
this.name = name;
this.age = age;
}
toPrint(){
return 'name:'+this.name+','+'age:'+this.age;
}
}
class Son extends Person{
constructor(name,age,sex){
super(name,age);
this.sex = sex;
}
toCount(){
return this.toPrint()+','+'sex:'+this.sex;
}
}
var son = new Son('z',22,'male');
console.log(son);
console.log(son.toPrint());
console.log(son.toCount());
</script>

该对象的结构图

5、对象中固有的方法(2019-11-30 补充)

以数组对象为例,.forEach,.indexOf()等为数组对象本身的方法

而数组对象的原型为Object,原型object有hasOwnProperty(查找该对象本身的属性或方法),isPrototypeOf(判断对象是否在另一个对象的原型链中),toString等方法,

数组对象可以使用原型中的方法,可以把这些方法称为继承方法

6、构造函数,实例,原型之间的关系(2019-12-02 补充)

图示:

7、实现构造函数之间的继承:

代码示例:

    <script>
class Parent {
constructor(name) {
this.name = name;
}
say() {
console.log('this is Parent');
}
}
class Child extends Parent {
constructor(name, age) {
super(name); //调用父类
this.age = age;
}
speak() {
console.log('this is Child');
}
}
var c = new Child('aaa', 233);
c.say();
c.speak();
console.log(c);
</script>

class实现

图示:

8、原型链

所谓的原型链,指的是一个对象的__proto__属性,及其一级一级__proto__的指向,一般会指向最后的Object(Object.prototype__proto__ = null)

js中函数的原型的更多相关文章

  1. JS中函数参数和函数返回值的理解

    函数本质就是功能的集合 JS中函数是对象,因此,函数名实际上仅仅是一个指向函数对象的指针,不会与某个函数绑定,所以,JS中没有重载(重载就是通过传递不同类型的参数,使两个相同函数名的函数执行不同的功能 ...

  2. 关于js中函数的调用问题

    js中函数的调用方法 1.直接调用 函数名(参数): 2.通过指向函数的变量去调用 例如: var myval = 函数名: 此刻 myval是指向函数的一个指针: myval(实际参数):此刻调用的 ...

  3. js中函数传参的情况

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  4. JS中函数void()

    <a href="javascript:void(0)">hello</a>/* * JS中函数void()的运用大体是这种新式; * void()是运算符 ...

  5. 对JS中函数的理解

    函数本质就是功能的集合 JS中函数是对象,因此,函数名实际上仅仅是一个指向函数对象的指针,不会与某个函数绑定,所以,JS中没有重载(重载就是通过传递不同类型的参数,使两个相同函数名的函数执行不同的功能 ...

  6. js中函数的参数为函数的情况即回调函数

    js中函数的参数可以是数组对象也可以是函数,当参数为函数时我们叫做回调函数 //定义回调函数function B() { console.log("函数B")setTimeout( ...

  7. js中__proto__(内部原型)和prototype(构造器原型)的关系

    一.所有构造器/函数的__proto__都指向Function.prototype,它是一个空函数(Empty function) Number.__proto__ === Function.prot ...

  8. js中的prototype原型解析

    在典型的面向对象的语言中,如java,都存在类(class)的概念,类就是对象的模板,对象就是类的实例.但是在Javascript语言体系中,是不存在类(Class)的概念的,javascript中不 ...

  9. 关于原生js中函数的三种角色和jQuery源码解析

    原生js中的函数有三种角色: 分两大种: 1.函数(最主要的角色)2.普通对象(辅助角色):函数也可以像对象一样设置属于本身的私有属性和方法,这些东西和实例或者私有变量没有关系两种角色直接没有必然的关 ...

随机推荐

  1. 用CSS绘制实体三角形并说明原理

    ;;margin:0 auto;border:6px solid transparent;border-top: 6px solid red;} 1.采用的是均分原理 盒子都是一个矩形或正方形,从形状 ...

  2. Kubernetes之Pod介绍

    下图Pod的客户端有两类:其他Pod和集群外的客户端 集群外访问需要通过service提供固定端点访问 service的类型有:ClusterIP.NodePort.LoadBalancer.Exte ...

  3. postman常用断言

    1.Code is 200 断言状态码是200 2.contains string 断言respoonse body中包含string 3.json value check (检查JSON值)

  4. API---注册表编程

    首先来认识一下键,项,值吧: 左边有五个根键: HKEY_CLASSES_ROOT HKEY_CURRENT_USER HKEY_LOCAL_MACHINE HKEY_USER HKEY_CURREN ...

  5. [JZOJ5778]【NOIP提高A组模拟2018.8.8】没有硝烟的战争

    Description 被污染的灰灰草原上有羊和狼.有N只动物围成一圈,每只动物是羊或狼.该游戏从其中的一只动物开始,报出[1,K]区间的整数,若上一只动物报出的数是x,下一只动物可以报[x+1,x+ ...

  6. WPF使用border画框

    以前的界面中使用的框大都是由美工做好的,但是这样就遇到几个问题: 框只是换一个颜色,就需要多做出一张图,资源包中也要多一个图片资源: 文字的数量会改变,用一张固定的图进行拉伸,边角处会变得越来越不尽如 ...

  7. (转载)linux命令-sed

    原文地址:https://www.cnblogs.com/zhangzongjian/p/10708222.html

  8. {每日一题}:tcp协议实现简单的文件下载器(单任务版)

    文件下载器客户端 这个版本的只是为了方便回顾一下TCP客服端,服务端的创建流程,缺点就是  服务器一次只能让一个人访问下载,过两个写个使用面向对象写一个多线程版的强化一下. from socket i ...

  9. PowerShell渗透--Empire(三)

    会话注入 我们可以使用usemodule management/psinject模块来进程注入,获取权限 设置下Listeners和ProcID这2个参数,这里的ProcID就是之前的CMD的pid, ...

  10. Cassandra官方介绍及安装

    Cassandra官方介绍及安装 这个数据库有很高的伸缩性和可用性,你完全不需要向性能妥协.在硬件或者云设施上做修改 官网:Cassandra官网 一.简介 cassandra这个数据库有很高的伸缩性 ...