Cause
When I printed out the properties in the data object under the Vue instance, I found an interesting thing:
Each of its properties have two corresponding get
and set
methods, I think this is superfluous, so go online check the Vue two-way binding principle of implementation, found that it and angular.js two-way binding implementation of the principle is completely different, angular is used in the data dirty detection, when the model changes, will detect whether all views bound related data, and then change the view. The Publish subscription mode that Vue uses is the point-to-point binding data.
Vue data binding is only two steps compile=>link
.
I have been thinking, Vue is through what to monitor the user's changes to model, until I found Vue data, each attribute has set
and get
attributes, I just understand come.
In peacetime, we create an object and modify its properties to be like this:
var obj = {
val:99
}
obj.val =;
Console.log (Obj.val)//100
There's no problem, but if you're going to monitor, when I change the properties of this object, I'm going to do something, what would you do?
Related thinking
This is going to be used getter
and setter
.
Let's say I'm going to add a property to a farm object name
, and every time I update the property, I'm going to do something name
that we can do:
var coder = function () {
var = this;
return {get
name () {
if (that.name) {
"That.name
}
"-"You have not named"
},
set name (val) {
Console.log (' You put the name into ' +val ')
that.name = Val
}}}
var isme = new Coder ()
Console.log (isme.name)
isme.name = ' Zhou Shen '
console.log (isme.name)
Console.log (ISME)
Output:
You will find that this object and the object in the top Vue data
are printed in the same way, owning get
and set
attributes.
Let's take a step-by-step analysis of the code above, which is interesting.
We first create an object literal:
var coder = function () {...}
And then the this
cache:
Next is the most important thing we return
have an object to go back to:
{Get
name () {...},
set name (val) {...}}
}
As the name suggests, get is a value, set is assigned, normally, we value and assignment is obj.prop
the way, but there is a problem, how do I know the value of the object changed? So it's your turn to set the stage.
You can take get
set
it and understand function
it as, of course, just so to understand that it is totally different from the two things.
Next, create a code farmer's instance, isme; At this time, Isme is not a name
property, when we call isMe.name
, we will enter into get name(){...}
, first to determine whether the isme have name
attributes, the answer is no, then add a name
property and assign it a value: " You have not named "; if there is a name
property, then return the name
property.
See here you must know get
how to use, yes, you can take get
a function as a value, the return value of the function is the value it gets.
I feel more important is the set
attribute when I assign a value to the instance:
At this point, the parameter set name(val){...};
val is the value I assigned to the attribute, and name
in this function, I can do a lot of things, such as bidirectional binding! Because every change in this value has to go through set, the other way is not to change it, the equivalent of a universal listener.
There is another way to achieve this.
The ES5 object prototype has two new properties and is __defineGetter__
__defineSetter__
designed to bind the object to get and set.
You can write like this:
var coder = function () {
}
coder.prototype.__definegetter__ (' name ', function () {
if (this.name) {
return this.name
}else{"
you have not named '
}"
coder.prototype.__definesetter__ (' name '), Function (val) {
this.name = val
})
var isme = new Coder ()
Console.log (isme.name)
isme.name = ' Zhou Shen '
console.log (isme.name)
Console.log (ISME)
The effect is the same, it is recommended to use the following method, because it is written on the prototype, so you can inherit and reuse.
Summarize
The above is the entire content of this article, I hope the content of this article for everyone's study or work can bring certain help, if you have questions you can message exchange.