var vm = { data: { message: 'no.1', username: 'Hello', password: 'World', quote: '!' }, computed: { reverseMessage: function() { var message = this.message; return message.split('').reverse().join(''); }, sucker: function() { return 'userna
var vm = {
data: {
message: 'no.1',
username: 'Hello',
password: 'World',
quote: '!'
},
computed: {
reverseMessage: function() {
var message = this.message;
return message.split('').reverse().join('');
},
sucker: function() {
return 'username:' + this.username + ';password:' + this.password + this.quote;
},
test: 'Hello World!'
}
};
var set = {};
var observeTarget = null;
observe(vm);
function observe(vm) {
_initData(vm);
_initComputed(vm);
}
function _initData(vm) {
var data = vm.data;
_walk(vm, data);
_eval(vm, data);
}
function _initComputed(vm) {
var computed = vm.computed;
_walk(vm, computed);
_eval(vm, computed);
}
function _walk(vm, data) {
for (var key in data) {
if (data.hasOwnProperty(key)) {
set[key] = [];
(function(key) {
Object.defineProperty(vm, key, {
enumerable: true,
configurable: true,
get: function() {
if (set[key].indexOf(observeTarget) == -1) {
set[key].push(observeTarget);
}
return isFunction(data[key]) ? data[key].call(vm) : data[key];
},
set: function(val) {
if (isFunction(data[key])) {
return;
}
if (set[key].indexOf(observeTarget) == -1) {
set[key].push(observeTarget);
}
data[key] = val;
set[key].forEach(function(item) {
if (item != observeTarget) {
if (isFunction(item)) {
item.call(vm);
}
}
});
}
});
}(key))
}
}
}
function _eval(vm, data) {
for (var key in data) {
if (data.hasOwnProperty(key)) {
if (isFunction(data[key])) {
observeTarget = key;
data[key].call(vm);
}
}
}
}
function isFunction(val) {
return typeof val == "function";
}
vm.message = 'GoodBye';
console.log(vm.reverseMessage); // output: GoodBye0
console.log(vm.test); // output: Hello World
vm.username = 'zyEros02';
console.log(vm.sucker);
vm.password = 'zysuper';
vm.quote = '?';
console.log(vm.sucker);
