日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Object.prototype 原型和原型链

發(fā)布時間:2023/11/30 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Object.prototype 原型和原型链 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Object.prototype 原型和原型鏈

原型

Javascript中所有的對象都是Object的實例,并繼承Object.prototype的屬性和方法,有些屬性是隱藏的。換句話說,在對象創(chuàng)建時會存在預(yù)定義的屬性,其中有一個屬性就是原型對象。在函數(shù)對象中存在原型對象prototype,在普通對象中沒有prototype,但存在__proto__。或者說使用function定義的對象與使用new操作符生成的對象之間有一個重要的區(qū)別,這個區(qū)別就是function定義的對象有一個prototype屬性,使用new生成的對象就沒有這個prototype屬性,存在__proto__。

var o =new Object(); console.log(o.__proto__); console.log(o.prototype);//undefinedvar fn = function(){} console.log(fn.prototype);//Object {constructor: function} var f1 = new fn(); console.log(f1.__proto__); console.log(f1.__proto__===fn.prototype);//true

原型鏈

那么__proto__是什么?每個對象都會在其內(nèi)部初始化一個屬性,就是__proto__。
普通對象中的__proto__是什么呢? Object的本質(zhì)函數(shù)對象,是通過new Function()創(chuàng)建,所以O(shè)bject.__proto__指向Function.prototype。同理,Function也是函數(shù)對象,因此Function.__proto__同樣指向Function.prototype。 Object.prototype對象也有__proto__屬性,但它比較特殊,為null。這個由__proto__串起來的直到Object.prototype.__proto__為null的鏈就是原型鏈。

console.log(Object.__proto__ === Function.prototype);//true console.log(Function.__proto__===Function.prototype);//true console.log(Object.prototype.__proto__);//null

當(dāng)我們訪問一個對象的屬性 時,如果這個對象內(nèi)部不存在這個屬性,那么他就會去__proto__里找這個屬性,這個__proto__又會有自己的__proto__,于是就這樣 一直找下去,也就是我們平時所說的原型鏈的概念。參考下面的例子:

var Fn = function(){}; Fn.prototype.Hello = function(){console.log("Hello World");} var f1 = new Fn(); f1.Hello();//Hello World

首先var f1=new fn(),f1是Fn的實例,可以得出f1.__proto__=Fn.prototype。當(dāng)我們調(diào)用f1.hello()時,首先f1中沒有Hello這個屬性,于是,它會到他的__proto__中去找,也就是Fn.prototype,而我們在上面定義了 Fn.prototype.Hello=function(){}; 于是,就找到了對應(yīng)的方法。
從一個更復(fù)雜的例子中看原型鏈的原理:

var Person = function() {}; Person.prototype.Name = function() {console.log("person name"); } Person.prototype.Sex = "male or female";var Younger = function() {}; Younger.prototype = new Person(); Younger.prototype.Age = function() {console.log("14-28") }; Younger.prototype.Sex = "female";var Ann = new Younger(); Ann.Name(); //person name console.log(Ann.Age()); //14-28 console.log(Ann.Sex); //female

對上述代碼,我們可以進(jìn)行如下分析:
var Younger = function() {}===>:Younger.__proto__=Person.prototype,
Younger.prototype = new Person()===>:Younger.prototype.__proto__ = Person.prototype,
var Ann = new Younger()===>Ann.__proto__=Younger.prototype,
綜上可得:
Ann.__proto__.__proto__ = Person.prototype

Ann本身沒有Name()方法,于是從Ann.__proto__(Younger.prototype)中找,仍沒有找到于是在向上一層Ann.__proto__.__proto__(Person.prototype)中尋找,最終在Person.prototype中找到對應(yīng)的方法并調(diào)用。
同理,Ann本身并沒有Age()方法,但在Ann.__proto__(Younger.prototype)存在。
對于Ann.Sex,在Ann.__proto__(Younger.prototype)中已經(jīng)能夠找到,便不再向上尋找,因此輸出是female。

轉(zhuǎn)載于:https://www.cnblogs.com/Nancy-wang/p/6903221.html

總結(jié)

以上是生活随笔為你收集整理的Object.prototype 原型和原型链的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。