面向對象編程中,子類可以覆蓋父類的方法,但有時你可能需要在子類中調用被覆蓋的父類方法。這通常有幾種不同的方法,具體取決于你使用的編程語言。以下是一些常見編程語言中調用父類被覆蓋方法的方式:
### Java
在Java中,可以使用`super`關鍵字來調用父類的方法:
```
ocation 對象
location 對象包含有關當前 URL 的信息。
location 對象是 Window 對象的一個部分,可通過 window.location 屬性來訪問。
<html>
<head>
<script type="text/javascript">
function currLocation()
{
alert(window.location);
}
function newLocation()
{
window.location="/index.html";
}
</script>
</head>
<body>
<input type="button" onclick="currLocation()" value="顯示當前的 URL">
<input type="button" onclick="newLocation()" value="改變 URL">
</body>
</html>
location 對象屬性
hash 設置或返回從井號 (#) 開始的 URL(錨)。
host 設置或返回主機名和當前 URL 的端口號。
hostname 設置或返回當前 URL 的主機名。
href 設置或返回完整的 URL。
pathname 設置或返回當前 URL 的路徑部分。
port 設置或返回當前 URL 的端口號。
protocol 設置或返回當前 URL 的協議。
search 設置或返回從問號 (?) 開始的 URL(查詢部分)。
http://example.com:1234/test/test.htm#part2:
hash: #part2
host:example.com:1234
hostname:example.com
href:http://example.com:1234/test.htm#part2
pathname:/test/test.htm
port:1234
protocol:http:
假設當前的 URL 是: http://www.w3school.com.cn/tiy/t.asp?f=hdom_loc_search
search:?f=hdom_loc_search
<script type="text/javascript">
document.write(location.host);
</script>
輸出:example.com:1234
location 對象方法
assign() 加載新的文檔。
reload() 重新加載當前文檔。
replace() 用新的文檔替換當前文檔。
assign() 方法可加載一個新的文檔。
location.assign(URL)
<html>
<head>
<script type="text/javascript">
function newDoc()
{
window.location.assign("http://www.w3school.com.cn");
}
</script>
</head>
<body>
<input type="button" value="Load new document" onclick="newDoc()" />
</body>
</html>
reload() 方法用于重新加載當前文檔。
location.reload(bool)
參數如果是false則從瀏覽器的緩存中重載,如果為true則從服務器上重載,默認值為false;
<html>
<head>
<script type="text/javascript">
function reloadPage(){
window.location.reload();
}
</script>
</head>
<body>
<input type="button" value="Reload page" onclick="reloadPage()" />
</body>
</html>
replace() 方法可用一個新文檔取代當前文檔。
location.replace(newURL)
replace() 方法不會在 History 對象中生成一個新的記錄。當使用該方法時,新的 URL 將覆蓋 History 對象中的當前記錄。
<html>
<head>
<script type="text/javascript">
function replaceDoc(){
window.location.replace("http://www.w3school.com.cn");
}
</script>
</head>
<body>
<input type="button" value="Replace document" onclick="replaceDoc()" />
</body>
</html>
實例:ThinkPHP框架
<a href='{:U('Circle/circleDetail',array('id'=>$vo['share_id']))}'> <!-- 此種方式會影響頁面顯示效果 -->
<div class="item item-avatar item-button-right">
<img src="{$vo.head_pic}">
<h2>{$vo.user_name}</h2>
<p>{:friend_date($vo['public_time'])}</p>
<i class=" button button-icon button-outline button-assertive" onclick="setCollection(this, '{$vo.share_id}', '{$user.user_id}')">{$vo.isCollection}</i>
</div>
</a>
代替a鏈接功能
原型鏈是ES5中實現繼承的主要手段, 因此相對比較重要, 我們需要深入理解原型鏈.
先來回顧一下構造函數、原型和實例的關系:
思考如下情況:
有些抽象, 我們通過代碼來理解:
// 創建Person構造函數
function Person() {
}
// 設置Animal的原型
Person.prototype = {
}
我們將代碼修改成原型鏈的形式:
// 1.創建Animal的構造函數
function Animal() {
this.animalProperty = "Animal"
}
// 2.給Animal的原型中添加一個方法
Animal.prototype.animalFunction = function () {
alert(this.animalProperty)
}
// 3.創建Person的構造函數
function Person() {
this.personProperty = "Person"
}
// 4.給Person的原型對象重新賦值
Person.prototype = new Animal()
// 5.給Person添加屬于自己的方法
Person.prototype.personFunction = function () {
alert(this.personProperty)
}
// 6.創建Person的實例
var person = new Person()
person.animalFunction()
person.personFunction()
代碼解析:
畫圖解析可能更加清晰:
當代碼執行到第3步(上面代碼的序號)的時候, 如圖所示:
img
當代碼執行第4步(上面代碼的序號)時, 發生了如圖所示的變化
img
代碼繼續執行
img
代碼繼續執行, 我們創建了一個Person對象
原型鏈簡單總結:
如果我們希望確定原型和實例之間的關系, 有兩種方式:
instanceof操作符
// instanceof
alert(person instanceof Object) // true
alert(person instanceof Animal) // true
alert(person instanceof Person) // true
isPrototypeOf()函數
// isPrototypeOf函數
alert("isPrototypeOf函數函數")
alert(Object.prototype.isPrototypeOf(person)) // true
alert(Animal.prototype.isPrototypeOf(person)) // true
alert(Person.prototype.isPrototypeOf(person)) // true
添加新的方法
錯誤代碼引起的代碼:
// 1.定義Animal的構造函數
function Animal() {
this.animalProperty = "Animal"
}
// 2.給Animal添加方法
Animal.prototype.animalFunction = function () {
alert(this.animalProperty)
}
// 3.定義Person的構造函數
function Person() {
this.personProperty = "Person"
}
// 4.給Person添加方法
Person.prototype.personFunction = function () {
alert(this.personProperty)
}
// 5.給Person賦值新的原型對象
Person.prototype = new Animal()
// 6.創建Person對象, 并且調用方法
var person = new Person()
person.personFunction() // 不會有任何彈窗, 因為找不到該方法
代碼解析:
總結
原型鏈對于繼承來說:
原型鏈存在的問題:
引用類型的問題代碼:
// 1.定義Animal的構造函數
function Animal() {
this.colors = ["red", "green"]
}
// 2.給Animal添加方法
Animal.prototype.animalFunction = function () {
alert(this.colors)
}
// 3.定義Person的構造函數
function Person() {
this.personProperty = "Person"
}
// 4.給Person賦值新的原型對象
Person.prototype = new Animal()
// 5.給Person添加方法
Person.prototype.personFunction = function () {
alert(this.personProperty)
}
// 6.創建Person對象, 并且調用方法
var person1 = new Person()
var person2 = new Person()
alert(person1.colors) // red,green
alert(person2.colors) // red,green
person1.colors.push("blue")
alert(person1.colors) // red,green,blue
alert(person2.colors) // red,green,blue
代碼解析:
原型鏈的其他問題:
為了解決原型鏈繼承中存在的問題, 開發人員提供了一種新的技術: constructor stealing(有很多名稱: 借用構造函數或經典繼承或偽造對象), steal是偷竊的意思, 但是這里可以翻譯成借用.
經典繼承的做法非常簡單: 在子類型構造函數的內部調用父類型構造函數.
經典繼承代碼如下:
// 創建Animal的構造函數
function Animal() {
this.colors = ["red", "green"]
}
// 創建Person的構造函數
function Person() {
// 繼承Animal的屬性
Animal.call(this)
// 給自己的屬性賦值
this.name = "Coderwhy"
}
// 創建Person對象
var person1 = new Person()
var person2 = new Person()
alert(person1.colors) // red,greem
alert(person2.colors) // red,greem
person1.colors.push("blue")
alert(person1.colors) // red,green,blue
alert(person2.colors) // red,green
代碼解析:
這個時候, 我們也可以傳遞參數, 修改上面的代碼:
// 創建Animal構造函數
function Animal(age) {
this.age = age
}
// 創建Person構造函數
function Person(name, age) {
Animal.call(this, age)
this.name = name
}
// 創建Person對象
var person = new Person("Coderwhy", 18)
alert(person.name)
alert(person.age)
經典繼承的問題:
回顧原型鏈和經典繼承:
如果你認識清楚了上面兩種實現繼承的方式存在的問題, 就可以很好的理解組合繼承了.
組合繼承(combination inheritance, 有時候也稱為偽經典繼承), 就是將原型鏈和經典繼承組合在一起, 從而發揮各自的優點.
組合繼承:
組合繼承的代碼:
// 1.創建構造函數的階段
// 1.1.創建Animal的構造函數
function Animal(age) {
this.age = age
this.colors = ["red", "green"]
}
// 1.2.給Animal添加方法
Animal.prototype.animalFunction = function () {
alert("Hello Animal")
}
// 1.3.創建Person的構造函數
function Person(name, age) {
Animal.call(this, age)
this.name = name
}
// 1.4.給Person的原型對象重新賦值
Person.prototype = new Animal(0)
// 1.5.給Person添加方法
Person.prototype.personFunction = function () {
alert("Hello Person")
}
// 2.驗證和使用的代碼
// 2.1.創建Person對象
var person1 = new Person("Coderwhy", 18)
var person2 = new Person("Kobe", 30)
// 2.2.驗證屬性
alert(person1.name + "-" + person1.age) // Coderwhy,18
alert(person2.name + "-" + person2.age) // Kobe,30
// 2.3.驗證方法的調用
person1.animalFunction() // Hello Animal
person1.personFunction() // Hello Person
// 2.4.驗證引用屬性的問題
person1.colors.push("blue")
alert(person1.colors) // red,green,blue
alert(person2.colors) // red,green
代碼解析:
組合繼承是JavaScript最常用的繼承模式之一.
組合繼承存在什么問題呢?
怎么解決呢?
原文來自:https://mp.weixin.qq.com/s?__biz=Mzg5MDAzNzkwNA==&mid=2247483876&idx=1&sn=d9241b9be5462019dbff10fb539e593f&chksm=cfe3f21bf8947b0db29ef6cc5c85acb7d2e60ecc6fb110d897db65af09962a5f34f334c4a4b0&cur_album_id=1566035091556974596&scene=189#wechat_redirect,如有侵權,請聯系刪除;
*請認真填寫需求信息,我們會在24小時內與您取得聯系。