var Vue = function () {}; Vue.prototype.data = {a: 1, b: 2}; var f1 = new Vue(); var f2 = new Vue(); f1.a = 3; console.log(f2.a) ; // 3
首先看下上面這段代碼,這是一種對象添加屬性的方式。
在函數或者類class上進行屬性值擴展時,如果使用原型上直接擴展的方式,對象實例化時無法區分不同對象之間的值作用域,用對象的方式初始化data並不合適。
var Vue = function () { this.data = this.datas(); }; Vue.prototype.datas = function () { return { c: 1, d: 2 } } var v1 = new Vue(); var v2 = new Vue(); v1.c = 5; console.log(v2.c); // 1
在函數內聲明實例屬性報存data,每個實例對象的data都是經過一次函數執行得到有不同的返回結果,所以返回data的值具有自己獨立的作用域。
* 在定義Vue實例時,給Vue傳參是一個對象,對象中data就是一個函數,Vue在實例化的時候會調用這個函數每個實例都會返回新的值,data得到不同的值作用域。
另外,賦值函數不一定要定義在原型上,也可以定義為函數或類的實例方法。