1. 对象的定义

  //定义对象
  function User(){ //在构造方法中定义属性
this.name = '张三';
this.age = 12; //在构造方法中定义方法:
this.run = function(){
alert(this.name + '在跑步')
}
} //原型链中定义属性
User.prototype.sex = '男'; //原型链中定义方法
User.prototype.work = function(){
alert(this.name + '在工作')
} // 静态方法的声明
User.getInfo = function () {
alert('我是静态方法')
} //对象的使用: 实例化对象
var user = new User('张三', 3); //属性的调用
alert('姓名:'+ user.name + '; 性别:' + user.sex); // 弹出: 姓名:张三; 性别:男 //给对象属性重新赋值
user.name = '李四';
user.sex = '女'; //方法的调用
user.run(); // 弹出:李四在跑步
user.work(); // 弹出:李四在工作 //静态方法的调用
User.getInfo(); // 弹出: 我是静态方法

注意: 原型链中声明属性将会多个实例共享,而构造函数不会

对象的继承

1. 对象的继承 之 对象冒充继承

 function User(){
this.name = '张三';
//在构造方法中定义方法:
this.run = function(){
alert(this.name + '在跑步')
}
} //原型链中定义属性
User.prototype.sex = '男'; //原型链中定义方法
User.prototype.work = function(){
alert(this.name + '在工作')
} //对象中的继承一: 对象冒充继承
function Student(){ //Student 继承 User对象,此方法叫: 对象冒充继承
User.call(this);
} var student = new Student();
student.run(); // 弹出:张三在跑步
student.work(); //报错,原因是: 对象冒充继承的方法只继承对象的构造函数的属性和方法

注意: 对象冒充继承的方法 只能 继承对象的构造函数的属性和方法,不能 继承原型链中的函数和方法

2. 对象的继承 之 原型链继承

 function User(){
this.name = '张三';
//在构造方法中定义方法:
this.run = function(){
alert(this.name + '在跑步')
}
} //原型链中定义属性
User.prototype.sex = '男'; //原型链中定义方法
User.prototype.work = function(){
alert(this.name + '在工作')
} //对象中的继承一: 原型链继承实现继承
function Student(){
}
Student.prototype = new User(); var student = new Student();
student.run(); // 弹出:张三在跑步
student.work(); // 弹出:张三在工作

注意:原型链继承的方法 可以 继承对象的构造函数的属性和方法,也可以 继承原型链中的函数和方法

  function User(name){
this.name = name;
//在构造方法中定义方法:
this.run = function(){
alert(this.name + '在跑步')
}
} //原型链中定义属性
User.prototype.sex = '男'; //原型链中定义方法
User.prototype.work = function(){
alert(this.name + '在工作')
} //带参数对象的实例化方法:
var user1 = new User('张三');
user1.run(); // 弹出: 张三在跑步
user1.work(); // 弹出:张三在工作 //对象中的继承一: 原型链继承实现继承
function Student(name){
}
Student.prototype = new User(); var student = new Student('李四');
student.run(); // 弹出: undefined在跑步
student.work(); // 弹出:undefined在工作

注意:原型链继承有个缺点就是 在实例化子类时,无法 给父类传参,如上代码,子类调用父类的方法时, 弹出传参属性为 undefined

为了解决此缺点,则可以使用  冒充对象继承 + 原型链继承的组合模式

3.  冒充对象继承 + 原型链继承的组合模式

function User(name){
this.name = name;
//在构造方法中定义方法:
this.run = function(){
alert(this.name + '在跑步')
}
} //原型链中定义属性
User.prototype.sex = '男'; //原型链中定义方法
User.prototype.work = function(){
alert(this.name + '在工作')
} //对象中的继承一: 原型链继承实现继承
function Student(name){ //冒充对象继承时,可以给父类传参
User.call(this, name);
} //原型链继承父类
//Student.prototype = new User(); //因冒充对象继承时,已经继承了父类的构造函数中的属性和方法,因此在原型链继承中也可只继承父类的原型链的属性和方法,即
Student.prototype = User.prototype; var student = new Student('李四');
student.run(); // 弹出: 李四在跑步
student.work(); // 弹出:李四在工作

ES5_对象 与 继承的更多相关文章

  1. js最好的继承机制:用对象冒充继承构造函数的属性,用原型prototype继承对象的方法。

    js最好的继承机制:用对象冒充继承构造函数的属性,用原型prototype继承对象的方法. function ClassA(sColor) { this.color = sColor; } Class ...

  2. 对象的继承关系在数据库中的实现方式和PowerDesigner设计

    原文:对象的继承关系在数据库中的实现方式和PowerDesigner设计 在面向对象的编程中,使用对象的继承是一个非常普遍的做法,但是在关系数据库管理系统RDBMS中,使用的是外键表示实体(表)之间的 ...

  3. 类和对象:继承 - 零基础入门学习Python038

    类和对象:继承 让编程改变世界 Change the world by program 上节课的课后作业不知道大家完成的怎样?我们试图模拟一个场景,里边有一只乌龟和十条鱼,乌龟通过吃鱼来补充体力,当乌 ...

  4. #JavaScript对象与继承

    JavaScript对象与继承 JavaScript是我在C语言之后接触的第二门编程语言,大一暑假的时候在图书馆找了一本中国人写的JavaScript程序设计来看.那个时候在编程方面几乎还是小白,再加 ...

  5. Javascript学习6 - 类、对象、继承

    原文:Javascript学习6 - 类.对象.继承 Javasciprt并不像C++一样支持真正的类,也不是用class关键字来定义类.Javascript定义类也是使用function关键字来完成 ...

  6. (79)Wangdao.com第十五天_JavaScript 对象的继承_prototype原型对象_封装_函数式编程

    javascript 内置了许多 function 函数(){...} js 执行首先就会执行自己内置的函数定义 (function Function.function Object) 对象的继承 大 ...

  7. Javascript实现对象的继承

    在Java和C#中,你可以简单的理解class是一个模子,对象就是被这个模子压出来的一批一批月饼.压个啥样,就得是个啥样,不能随便动,动一动就坏了.而在Javascript中,没有模子,月饼被换成了面 ...

  8. 关于js的对象原型继承(一)

    javascript中,对象的继承是通过原型去继承. 可以这样理解:js中的对象,包含的除了属性和方法,还有一个最基本的原型__proto__对象.这个原型__proto__指向谁,这个对象就继承谁. ...

  9. js一种继承机制:用对象冒充继承构造函数的属性,用原型prototype继承对象的方法。

    js一种继承机制:用对象冒充继承构造函数的属性,用原型prototype继承对象的方法. function ClassA(sColor) { this.color = sColor; } ClassA ...

随机推荐

  1. Sword 第三方库介绍二

    /* uuid生成 */ #include <stdio.h> #include <stdlib.h> /* calloc()函数头文件 */ #include <ass ...

  2. JMeter 使用 http长连接的方法

    前言 如果需要在JMeter通过http长连接发送请求,首先需要选择了Use KeepAlive 长连接协议,虽然默认是勾选的,但也需要确认一下. 除了选择了Use KeepAlive 长连接协议,还 ...

  3. 制作Visual Studio 2017 (VS 2017) 离线安装包 (转)

    史上功能最强大的Visual Studio 2017版本发布,但是由于版本更新速度加快和与第三方工具包集成的原因,微软研发团队没有为这个版本提供离线下载的安装文件.如果用户处在一个与外网隔离的网络环境 ...

  4. [LeetCode] 232. Implement Queue using Stacks 用栈来实现队列

    Implement the following operations of a queue using stacks. push(x) -- Push element x to the back of ...

  5. 使用office365 world2016发布编辑备份你的博客

    开门见山.   如果你曾使用过live writer或者world 2013及之前版本发布过博客,那么请直接异步到最后的tips来查找你可能遇到的问题.     在office365中找到博客模板 打 ...

  6. leetcode腾讯精选练习(50 题)(持续更新)

    1.除自身以外数组的乘积 给定长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘 ...

  7. 一、Spring之组件注册-@Configuration&@Bean给容器中注册组件

    xml配置方式 首先我们创建一个实体类Person public class Person { private String name; private Integer age; private St ...

  8. mysql 按照两个字段之和进行排序

    SELECT *,zan_num+fake_zan_num show_zan FROM `tf_news` order by show_zan desc TP实现 $news = M('news'); ...

  9. 2019CCPC网络赛

    ^&^ (HDU 6702) Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Other ...

  10. 45 容器(四)——手写LinkedList

    概念 LinkedList级双向链表,它的单位是节点,每一个节点都要一个头指针和一个尾指针,称为前驱和后继.第一个节点的头指针指向最后一个节点,最后一个节点的尾指针指向第一个节点,形成环路. 链表增删 ...