Vue中Object prototype是不能這樣使用嗎?

時間 2021-05-30 20:06:45

1樓:Dobility

(假設你定義了 Object.prototype.foo = function(),假設你用的是 Vue Router)

這是 Vue Router + for-in 導致的。在 Vue Router 原始碼中有乙個 resolveQuery 函式:

export

function

resolveQuery

(query:?

string

,extraQuery

:Dictionary

>={},

_parseQuery:?

Function):

Dictionary

>catch(e

)}// 這裡有個 for-in,因為 extraQuery 是乙個物件,繼承了 Object,會遍歷到 Object.prototype

for(

const

keyin

extraQuery

)return

parsedQuery

}而 for-in 是會遍歷到乙個物件自有的、繼承的、可列舉的、非Symbol的屬性,在函式中 extraQuery 是乙個物件,在原型鏈上它是繼承了 Object.prototype.foo 的方法,所以它在定義的時候是乙個可列舉的,所以也會被遍歷到,然後在計算路由的 href 時就會把你的方法的內容拼接到 url。

而且,這個函式只要在路由發生變化的時候,都會計算,所以你很難避開這個 for-in。

所以解決方法就是讓它變成不可列舉的,做法以及建議樓上已經提到了~

2樓:錢朝坤

不要修改Object的prototype,會引發很多你根本意想不到的問題。

如果希望定義乙個方法,之後可以全域性引用,可以在main.js裡掛到vue的原型上,而不是Object的原型上

3樓:

兩個問題。

乙個是怎樣加屬性不會被遍歷到url裡面。

enumerable值為false就行

Object

.defineProperty

(Object

.prototype

,'isPlainObject'

,return

proto

===Object

.getPrototypeOf

(this);}

})第二個問題我怎麼改乙個內建物件的方法。

function

copyProto(o

);const

__proto=o

.__proto__

;proto

.__proto__

=__proto;o

.__proto__

=proto

;Object

.defineProperty

(proto

,'push'

,});}

4樓:賀師俊

盡量不要改任何 builtin 物件的 prototype,尤其是修改 Object.prototype 乃大忌。

最簡單一點,Object.prototype.foo = function () {} 之後,for (key in {}) ...

會遍歷到 foo。於是,如果用 for in 遍歷來序列化引數,就會出現拼接方法體。不過這貌似不像是 Vue 核心庫的坑。

vue開發的專案,前端寫的 vue檔案中的生命週期方法,線上還存在嗎?

xvrzhao mounted只是vue.js提供給你的介面,你在例項化 new Vue 的時候通過這個介面將你的業務邏輯傳給vue.js去處理,vue.js會在特定的階段去呼叫你的提供的mounted方法。你的說法就好比說你自己定義了乙個函式foo,瀏覽器也不認識這個foo,但是你呼叫foo 時,...

vue框架中元件可以通過「this root 」的方式訪問根元件的data物件,為何vuex會熱?

胖虎 其實怎麼說呢.其實一開始我也有過這樣的想法.如果Vue一開始設計的初衷是這樣的,一切的傳值,一切的元件通訊.都要依靠Vuex來實現,那麼你會覺得Vue傳值為什麼這麼複雜,或許會這樣問,為什麼Vue傳值這麼複雜,有沒有什麼簡單的方法可以去實現呢.狀態管理庫非常的多,Vue那麼官方的推薦就是Vue...

vue中為什麼要使用filter?

水秋玄 filter 是做一些統一的處理,比如轉大小寫,格式化時間 新增前字尾等等。用method也可以,但是使用按需混入太麻煩,自動全域性混入又沒必要,因為不是所有元件都用到。computed也可以用,但是computed實際是檢測所包含的的變數的改變,跟一般方法還是有區別,再者使用compute...