Js的 继承
Js 和 Java , C等語言不是很一樣 . 其他語言有 類和實例 但是Js就比較特殊 , 所以 類和實例 只能說是大多數面向對象編程的語言的基本概念 .
Js比較特殊 , 它不去分類和實例的概念 .? 而是通過原型(prototype)來實現面向對象編程? .?
下面介紹Js中第一種用于繼承的方法
var robot = {name: 'Robot',height: 1.6,run: function () {console.log(this.name + ' is running...');} };這一段代碼 , 聲明了一個對象robot . 這個對象有姓名 , 身高(屬性) , 還有自己的行為(方法) . 如果我們能根據這一個對象來建立另一個對象該是多么美好的事情呀 .?
有需求就有產出 . 所以請看下面的代碼 . 我們可以根據已經有的 "實例" 來聲明一個新的 "實例"? .
var Student = {name: 'Robot',height: 1.2,run: function () {console.log(this.name + ' is running...');} };var xiaoming = {name: '小明' };xiaoming.__proto__ = Student;可以看出 , 我們先寫了一個Student的實例 , 然后謝了一個xiaoming的實例 . 最后我們講小明的原型 (prototype) 指向了 Student . xiaoming有自己的name屬性 , 但是沒有run方法 , 然后從Student中繼承下來 , 得到了 Student的run方法.
?
這個方法不建議使用 . 因為低版本的IE不支持 . 下面我們說一個真正用的繼承 .
除了直接用 {...} 來創建一個對象之外 . Js 還有一種利用構造方法 , 來創建對象的方法 . 首先我們定義一個構造函數 .
function Student(name) {this.name = name;this.hello = function () {alert('Hello, ' + this.name + '!');} }... 這個是不是有點像普通的函數 ? 但是普通函數是不能直接寫this的會報錯 .? 我們可以通過一個關鍵詞 new 來調用這個函數將函數轉變為 構造函數 , 然后去聲明一個對象. .?
var xiaoming = new Student('小明'); xiaoming.name; // '小明' xiaoming.hello(); // Hello, 小明!如果我們不寫new 的話 this是指向undefined的 . 然后xiaoming.name也只會返回一個undefined . 但是如果我們寫了new 這個普通的函數就會變成一個構造函數 . 然后在函數的末尾自動加上一個 . return this;
構造函數千萬不要忘記寫new 此外為了區分普通函數和構造函數 , 我們按照約定構造函數的首字母應該大寫 . 在某些語法檢查工具當中這樣的好習慣會在你忘了寫new的時候檢測到并且提醒你寫錯了 .
在傳統的面向對象語言如 C++ Java繼承的本質是擴展一個現有的Class 生成一個Subclass . 由于這些語言嚴格區分類和實例 , 所以繼承實際上是對類型的擴展 , 但是Js中由于采用原型繼承,我們無法直接擴展一個類 , 因為根本就不存在Class這種類型(聽起來Js還聽驕傲?)
http://blog.csdn.net/hy1405430407/article/details/48626771
轉載于:https://www.cnblogs.com/A-FM/p/5874051.html
總結
- 上一篇: 【Effective Java】6、使用
- 下一篇: onhashchange