在回忆怎么判断一个对象是一个数组的方法时,想到了Array.isArray()这个方法,突然有点不理解,这是什么意思,isArray()怎么可以通过Array直接调用,这样的情况很多,比如Object上的方法。
看了几篇文章,简单理解是:JS中有“静态属性”和实例属性。
定义在构造函数上的属性。只能通过构造函数名来调用。
那么就是说,上面的setName方法可以通过Person来调用,不能通过实例调用。因为setName是其内部方法。 举个例子:
通过打印p,可以看到:
可以发现,myName和getAge属性并没有被实例所继承。
我的理解是: 定义在构造函数原型上的属性及在构造函数内部绑定到this上的属性。这些属性可以通过实例对象直接调用。
这个时候,p可以调用name,age,getName这些属性。
可以通过Object.getOwnpropertyNames()等此类方法查看有哪些属性。
<html><head>
<title>JavaScript 对象方法 类方法 原型方法的区别私有属性 公有属性 公有静态属性的区别</title>
<script language="javascript" type="text/javascript" >
//定义Person类
function Person(name){
//私有属性MyTime、ID
var MyTime = " 2010-12-12"
var ID="773C0D35-298A-4660-B803-9EADC250ED61"
//公有属性MyName
this.MyName = name
//对象方法(实例化后才能调用) 位置:Person类的内部 语法格式:this.方法名称 = function([参数...]){ 语句行}
this.ShowMyName = function() {
alert("My name is " + this.MyName + MyTime )
}
//this.Init()
}
//类方法(实际是静态方法直接调用) 位置:Person类的外部 语法格式:类名称.方法名称 = function([参数...]){ 语句行}
Person.EnglishandFrench = function() {
//访问静态属性 语法格式:类名称.公有静态属性;或者使用语法格式:this.公有静态属性;
alert(Person.NAME + " can speak " + this.ENGLISH +" and "+ Person.prototype.FRENCH)
}
//原型方法(实例化后调用或者直接调用) 位置:Person类的外部 语法格式:类名称.prototype.方法名称 = function([参数...]){ 语句行}
Person.prototype.ChineseandFrech = function() {
//编写一个原型方法相当扩充了一个对象方法,稍作变化可复制到类的内部成为一个对象方法
//访问公有属性 语法格式:this.公有属性
//访问公有静态属性 语法格式:类名称.公有静态属性;
alert(this.MyName + " can speak " + Person.CHINESE + " and " + this.FRENCH+", "+ Person.prototype.FRENCH +" do better.")
}
//只有原型方法执行后内部扩充到Person类的属性才能生效
Person.prototype.Init = function() {
//定义公有属性PersonNo
this.PersonNo = ""
//定义公有数组属性 [] 等价于 new Array()它现在是几维数组或是混合数组要根据赋值后才知道
this.ArrInfo = []
//定义一个json对象属性
this.jsonData = {}
}
//公有静态属性 位置:Person类的外部
Person.NAME="Jack"
Person.ENGLISH="in english"
Person.CHINESE="in chinese"
//原型属性(当作公有静态属性使用 语法格式:类名称.prototype.公有静态属性;不能使用语法格式:this.公有静态属性;)
//原型属性(当作公有属性使用 语法格式:类名称.prototype.公有属性; 或者使用语法格式:this.公有属性;)
Person.prototype.FRENCH="in french"
var p = new Person("Rose")//实例化
p.ShowMyName()
Person.EnglishandFrench()
p.ChineseandFrech()
//ChineseandFrech()当作静态方法直接调用,请注意 MyName是对象属性 原型方法内不能调用它
//当作静态方法直接调用时内部成员必须都是静态属性,下面这样调用是错误的
Person.prototype.ChineseandFrech()
//使用this.Init()这行代码放在定义Person类内部也一样初始化
p.Init()
p.PersonNo = "A1B2C3"
alert(p.PersonNo)
p.ArrInfo[0]='123'
alert(p.ArrInfo[0])
p.ArrInfo[1]=["111","222","333"]
alert(p.ArrInfo[1][2])
p.jsonData = { flash_url : "../swfupload/swfupload.swf",
custom_settings : {
upload_target : "divFileProgressContainer"
},
debug: false }
alert(p.jsonData.flash_url+" "+p.jsonData.custom_settings.upload_target)
</script>
</head>
<body>
<div>E-mail:[email protected]</div>
<div>尽量将方法定义为原型方法,原型方法避免了每次调用构造函数时对属性或方法的构造,节省空间,创建对象快.</div>
</body>
</html>
今天没事的时候,研究了一下JS继承的实现,下面是html的源码:<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JS类的继承的实现</title>
<script type="text/JavaScript">
//定义父类及公有、私有、静态属性及方法
function parent(){
var pname = "private"//私有属性
var pfun = function(){//私有方法
console.log("调用类的私有方法")
}
this.getName=function(name){//公有方法
this.name = name//公有属性
return pname+"私有属性+公有属性"+this.name+"调用类的共有方法"
}
}
//定义静态属性及方法
parent.staticPro = "static property"
parent.staticFun = function(){
var str = "invoke class's static function"
return str
}
//方法1 原型链继承
function childOne(){}
childOne.prototype = new parent()
//方法2 call/apply继承
function childTwo(){
parent.call(this)
}
function init(){
var c1 = new childOne()
console.log(c1.getName("child1"))//
console.log(c1.name)
var c2 = new childTwo()
console.log(c2.getName("child2"))
console.log(c2.name)
console.log(parent.staticPro)
console.log(parent.staticFun())
}
</script>
</head>
<body onload="init()">
<header>页眉</header>
</body>
</html>