Static and Instance Methods in JavaScript
class.method/instance method
https://abdulapopoola.com/2013/03/30/static-and-instance-methods-in-javascript/
在阅读vue示例代码时,经常看到Vue.xx函数或者$vm.yy函数,不太清楚这两者之间有什么区别。
google以后发现实际上还是有本质的区别的。
我们知道javascript的继承模型和java,php等面向对象的编程语言有非常大的差别
js是一个弱典型的类型语言,class类并不是真正的class,实际上class就是本身也是object的construct functions.我们通过使用new constructor调用来创建新的对象,这实际上某种意义上模拟了OOP.但是请记住:js的继承模型和传统的javas, php是不同的!
首先有static property/instance property这个概率。所有对象属性(this.xx)都为public的,可以通过thisobj.xx直接访问。当然我们可以通过在constructor function(也就是class类定义)中增加var关键字使得相应属性变为private的,对于这种private类型的属性,我们必须通过定义accessors和setters才能够访问。
//Constructor
var Person = function (name, age){
//private properties
var priv = {}; //Public properties
this.name = name;
this.age = age; //Public methods
this.sayHi = function(){
alert('hello');
}
} // A static method; this method only
// exists on the class and doesn't exist
// on child objects
Person.sayName = function() {
alert("I am a Person object ;)");
}; // An instance method;
// All Person objects will have this method
Person.prototype.setName = function(nameIn) {
this.name = nameIn;
} // Tests
var per = new Person('John Doe', 22); //Shows alert
Person.sayName(); //TypeError: Object [object Object] has no method 'sayName'
per.sayName() //Show alert
per.sayHi(); //John Doe
per.name; //
per.age; per.setName('Jane Doe'); //Jane Doe
per.name;
需要注意的是定义在类(构造函数)的属性上的static属性或者方法是不能在instance实例的上下文中访问的。但是java语言在这一点上就有所不同,在java中静态方法或者属性是可以在实例的上下文环境中访问的。这看起来非常奇怪,因为实例objects对象中并没有那个变量
这里我引用一下java的相关说明:
"
你也可以通过对象引用的模式来访问静态方法,比如:
myBike.numberOfBicycles
"
ES6中class method和instance method的对比
// es6 javascript code
class Foo {
bar() {...} static baz() {...}
}
const f = new Foo()
f.bar()
Foo.baz
foo = {bar: 'baz'};
console.log(foo.bar); // logs "baz" // none-es6 javascript code
foo = {};
console.log(foo.bar); // logs undefined function Foo(){}
Foo.prototype = {bar: 'baz'};
f = new Foo();
console.log(f.bar);
// logs "baz" because the object f doesn't have an attribute "bar"
// so it checks the prototype
f.bar = 'buzz';
console.log( f.bar ); // logs "buzz" because f has an attribute "bar" se
Foo.talk = function () {
alert('hello world!');
};
Foo.talk()
以Vue为例再看Vue.method/vueComponent.method
最后,我们来看Vuejs plugin中的几种用法,大家可以对照上面的所谓static和instance method来看:
MyPlugin.install = function (Vue, options) {
// 1. add global method or property
Vue.myGlobalMethod = function () {
// some logic ...
} // 2. add a global asset
Vue.directive('my-directive', {
bind (el, binding, vnode, oldVnode) {
// some logic ...
}
...
}) // 3. inject some component options
Vue.mixin({
created: function () {
// some logic ...
}
...
}) // 4. add an instance method
Vue.prototype.$myMethod = function (methodOptions) {
// some logic ...
}
}
Static and Instance Methods in JavaScript的更多相关文章
- Mongoose 'static' methods vs. 'instance' methods
statics are the methods defined on the Model. methods are defined on the document (instance). We may ...
- Java SE 8 docs——Static Methods、Instance Methods、Abstract Methods、Concrete Methods和field
一.Static Methods.Instance Methods.Abstract Methods.Concrete Methods ——Static Methods:静态方法 ——Instance ...
- Core Java Volume I — 4.4. Static Fields and Methods
4.4. Static Fields and MethodsIn all sample programs that you have seen, the main method is tagged w ...
- Swift编程语言学习12 ——实例方法(Instance Methods)和类型方法(Type Methods)
方法是与某些特定类型相关联的函数.类.结构体.枚举都能够定义实例方法:实例方法为给定类型的实例封装了详细的任务与功能.类.结构体.枚举也能够定义类型方法:类型方法与类型本身相关联.类型方法与 Obje ...
- UIView 实例方法 Instance Methods(转)
好了,我接着上篇,开始我们的对UIView 实例方法的探索 UIView 实例方法 Instance Methods 初始化一个视图 - (id)initWithFrame:(CGRect)aRect ...
- Instance Methods are Curried Functions in Swift
An instance method in Swift is just a type method that takes the instance as an argument and returns ...
- A Simple Example About Privileged Methods in JavaScript
Douglas Crockford classified the "class methods" in JavaScript into three types: private, ...
- Difference Between static and default methods in interface
I was learning through interfaces when I noticed that you can now define static and default methods ...
- Static Fields and Methods
If you define a field as static, then there is only one such field per class. In contrast, each obje ...
随机推荐
- linux系统盘扩容操作
linux操作系统原来的50硬盘空间不够用了,如果再加一块60G硬盘,怎样扩容呢?今天我参考了前辈门的文档实际操作了一下,涉及到PV/VG/LV的相关操作. 当50G系统硬盘不够,再挂载一块60G,就 ...
- 判断cms-暴库-后台查找-密码破解
1.判断网站CMS类型 判断目标 使用工具: 脚本语言 wvs 御剑 domain明小子 操作系统 wwwscan 啊d pangolin(穿山甲) 搭建平台 站长工具 netpark ...
- CSS伪类选择器:is、not
本文介绍一下Css伪类:is和:not,并解释一下is.not.matches.any之前的关系 :not The :not() CSS pseudo-class represents element ...
- No converter found capable of converting from type [java.lang.String] to type [java.util.Map<java.lang.String, org.springframework.boot.logging.LogLevel>]
java.lang.IllegalStateException: Failed to load ApplicationContext at org.springframework.test.conte ...
- 201871010118-唐敬博《面向对象程序设计(Java)》第二周学习总结
博文正文开头格式:(3分) 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.co ...
- split分割字符串返回字符串数组
<script type="text/javascript"> var str='liu jin yu'; var str1=str.split(' '); docum ...
- 【Js】创建对象的6种方式总结、(底部包含属性名为动态的形式)
一.new 操作符 + Object 创建对象 1 var person = new Object(); 2 person.name = "lisi"; 3 person.age ...
- 【DP】【P5615】 [MtOI2019] 时间跳跃
Description 给定 \(n\) 条边,第 \(i\) 条边的长度为 \(i\),每条边都有 \(50\%\) 的概率被选择,求如果选出的边能组成一个平面凸多边形,则方案的权值是方案中边的数量 ...
- Spring事务注解@Transactional失效的问题
在项目中发现事务失效,使用@Transactional注解标注的Service业务层实现类方法全部不能回滚事务了,最终发现使用因为Spring与shiro进行整合之后导致的问题,将所有的Service ...
- Mercari Price Suggestion in Kaggle
Mercari Price Suggestion 最近看到了一个竞赛,竞赛的内容是根据已知的商品的描述,品牌,品类,物品的状态等特征来预测商品的价格 最后的评估标准为 平均算术平方根误差Root Me ...