Java程序员的JavaScript学习笔记(2——属性复制和继承)

27 篇文章 0 订阅
16 篇文章 0 订阅
计划按如下顺序完成这篇笔记:
    1. Java程序员的JavaScript学习笔记(1——理念)
    2. Java程序员的JavaScript学习笔记(2——属性复制和继承)
    3. Java程序员的JavaScript学习笔记(3——this/call/apply)
    4. Java程序员的JavaScript学习笔记(4——this/闭包/getter/setter)
    5. Java程序员的JavaScript学习笔记(5——prototype)
    6. Java程序员的JavaScript学习笔记(6——面向对象模拟)
    7. Java程序员的JavaScript学习笔记(7——jQuery基本机制)
    8. Java程序员的JavaScript学习笔记(8——jQuery选择器)
    9. Java程序员的JavaScript学习笔记(9——jQuery工具方法)
    10. Java程序员的JavaScript学习笔记(10——jQuery-在“类”层面扩展)
    11. Java程序员的JavaScript学习笔记(11——jQuery-在“对象”层面扩展)
    12. Java程序员的JavaScript学习笔记(12——jQuery-扩展选择器)
    13. Java程序员的JavaScript学习笔记(13——jQuery UI)
    14. Java程序员的JavaScript学习笔记(14——扩展jQuery UI)

这是笔记的第2篇,聊聊属性复制和继承的事情。非常基础,同样,也非常重要。


作者博客:http://blog.csdn.net/stationxp

作者微博:http://weibo.com/liuhailong2008

转载请取得作者同意



一切皆对象

属性是相对对象来说的,所以问题来了什么是对象?对象是类的实例。好吧,够了,这是Java程序员的想法。

如何从JavaScript的角度考虑这个问题呢。

首先,

为什么要有对象?

简单基本的数据类型在面对复杂的业务逻辑时,不足堪用,所以我们需要更复杂的,针对要解决的问题定制的数据结构。

所以我们需要对象(比如日期),我们希望对象有自己的属性、可以有自己的方法,甚至还需要事件。

什么是对象?

JavaScript中,数组(Array)、日期(Date)、正则表达式(RegExp)都是对象,他们有自己的属性、方法,甚至事件。自成一体,描述一类事物,完成特定的功能。

在Java的世界中,“一切皆对象”,在JavaScirpt中,还可以喊出同样的口号吗?Yes,we can!

JavaScript中:

  1. 简单数据类型,有其封装类型,Number,Boolean。
  2. 数组,var arr = []; 和var arr = new Array();得到的都是数组对象。
  3. 函数也是对象,比Java还彻底,真正做到一切皆对象了。
  4. 对象是对象,指的是通过如下语句创建的对象:var o = {}; 或 var o = new Object(); 或 var o = Object.create({})。
  5. JavaScript的主要战场(window)和用武之地(dom)也都是对象。

如何得到对象? 

 通过以下语句可以获得对象。

 var str = "我是一个 String 对象。"
 var obj = { intro: "我是一个 Object 对象。" }; 
 var fun = function() { 
    console.log( "我是一个 Function 对象。"); 
 }; 

上面展示类两种获得自定义对象的方式,这是最简单的方式,还有其他方式。


简单提一下prototype属性的作用。每个函数对象都会有一个prototype属性,指向创建函数的“原型”。

下面的代码:

  function UiObject() { } 
 UiObject.prototype = {
  type : "RootUiObject"     //UiObject原型的属性
 }
 var u1 = new UiObject();         //创建两个UiObject的实例 
 var u2 = new UiObject();

 console.log(u1.type);           //输出:RootUiObject,原型的属性可以在各实例之间分享

 console.log(u1.type === u2.type); // 输出:true,引用的是同一个

正因为prototype的这个威力,我们更多地采用上面的代码,创建函数、设定函数原型、创建函数实例。过程如下所示:

function MyFunc(){}

MyFunc.prototype = {}

var myObj = new MyFunc();


接下来,看对象的属性和属性的复制,包括作为属性的方法的复制。

属性的复制

第1篇中,我们聊到了“众生平等”,属性不只是单纯地指对象的数值类型的属性。

我们可以通过 o['name'] = 'liuhailong'; 语句设置对象o的name属性为某个字符串值。

也可以通过 o['write'] = function(){  return 'I am writing study notes on JavaScript';  }语句设置对象o的write属性为某个函数。

两者之间没有区别。

所以提到“属性继承和复制”时,“属性”的概念是广义的,指的是对象所有的属性和方法(“所有的”这个说法不太准确。以后我们会知道,属性也有自己的特性,有的不能被遍历,有的只读,有的不能扩展,这些复杂的情况以后再考虑)。

通过如下方法,可以实现将source的属性全部复制到destionation对象上。

function(destination, source) { 
<span style="white-space:pre">	</span>for (var property in source) {
    <span style="white-space:pre">		</span>destination[property] = source[property]; 
<span style="white-space:pre">	</span>}
<span style="white-space:pre">	</span>return destination; 
}


如何继承?

什么是继承?

继承是指子元素的对象什么都没做,仅仅靠指定和父元素的关系,就自动拥有了父元素的特性和能力。  

如何实现继承?

继承的要点是:指定和父对象的关系

 

 /*   定义根对象  */
 function UiObject() {}
 UiObject.prototype = {
 	type : "UiObject",
 	author : 'liuhailong',
 	render : function(){
 		console.log('Render Me!');
 	}
 }


 /*   定义Panel */
 function UiPanel( height, weight ) { 
    this.type = "UiPanel"; 
    this.height = height; 
    this.weight = weight; 
 } 
 UiPanel.prototype = new UiObject(); //指定继承关系
 
 
 /*   测试 */
 var p = new UiPanel(100,60);
 console.log(p.author); // ouput  : liuhailong
 p.render();			// output : render me

接下来,给“父类”增加一个“方法”,看看子类是否能够直接使用。

 /*   定义根对象  */
 function UiObject() {}
 UiObject.prototype = {
 	type : "UiObject",
 	author : 'liuhailong',
 	render : function(){
 		console.log('Render Me!');
 	}
 }


 /*   定义Panel */
 function UiPanel( height, weight ) { 
    this.type = "UiPanel"; 
    this.height = height; 
    this.weight = weight; 
 } 
 UiPanel.prototype = new UiObject(); //指定继承关系
 
 
 /*   测试1  
 var p = new UiPanel(100,60);
 console.log(p.author); // ouput  : liuhailong
 p.render();			// output : render me
 */
 
 /*  扩展“父类”的功能    */
 UiObject.prototype.init = function(){
 	console.log("Init the Ui Control "); 
 } 
 
 /*   测试2   */
 /*   测试2   */
 var p1 = new UiPanel(100,60);
 var p2 = new UiPanel(200,60);
 p1.init();                            // output : Init the Ui Control 
 console.log(p1.author === p2.author); //true
通过扩展父类,可以增加子类的功能。

O了。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
继承Java中的一种重要的面向对象编程概念,它允许一个类(子类)继承另一个类(父类)的属性和方法。通过继承,子类可以从父类中获得已有的属性和方法,并且可以在此基础上进行扩展或者修改。 在Java中,使用关键字"extends"来实现继承。子类通过继承父类,可以使用父类中的非私有属性和方法。子类可以直接访问父类的公有属性和方法,也可以通过super关键字来访问父类的构造方法和成员。 下面是一个简单的继承示例: ```java // 父类 class Animal { private String name; public Animal(String name) { this.name = name; } public void eat() { System.out.println(name + "正在吃饭"); } } // 子类 class Dog extends Animal { public Dog(String name) { super(name); } public void bark() { System.out.println("汪汪汪"); } } public class Main { public static void main(String[] args) { Dog dog = new Dog("旺财"); dog.eat(); // 调用父类的eat方法 dog.bark(); // 调用子类的bark方法 } } ``` 在上面的示例中,Animal类是父类,Dog类是子类。Dog类通过关键字"extends"继承了Animal类,从而可以使用Animal类中的属性和方法。在main方法中,我们创建了一个Dog对象,并调用了eat方法(来自父类)和bark方法(来自子类)。 通过继承,子类可以扩展父类的功能,并且可以在需要时覆盖父类的方法来实现特定的行为。继承Java中实现代码重用和多态性的重要手段之一。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值