js获得父对象的方法(非dom对象,而是自定义的函数对象)

JavaScript010

js获得父对象的方法(非dom对象,而是自定义的函数对象),第1张

可以这样

<script type="text/javascript">

var a=function(){

this.x=1

var parent = this

this.b=function(){

this.x=2

alert("parent.x "+parent.x)

}

}

var c=new a()

c.b()

递归经常碰到的问题了。

出问题的地方是 Run(temp,path)

既然是递归的调用 而且这个函数本身 有 return 值 那么 你应该在

调用 Run(temp,path)的时候 接收他的返回值

应该写成 value = Run(temp,path)

1. 现在你可以设成 局部变量 var value 了。

之所以出现undefined就是因为

return value 这行代码 就执行了 1次 也就是 第一个执行 var test=Run(myjson,mypath)的时候

这个时候 value 变量还没有定义出来, value是在 最后一次执行 Run(temp,path)的时候才定义的,而需要把这个 返回出来 并接收 才有效。

2. json=json[path[0]],

这个地方 不会报错 你是写错了代码

你如果 把这个地方 写成 json=json[path[0]],

那么下面 Run(temp,path)是不是也应该写成 Run(json,path)呢?

这样就不会报错。

3. 在javascript里 数组和 对象 都是属于 引用类型的, 这是为了 节省内存空间。

其实道理简单, var a = {b:1} 这个时候 a变量里面 存储的是 保存这个 对象的内存地址,

打个比方 这个对象是一个宝箱 他是隐藏在内存的, a变量里面是打开这个宝箱的钥匙和地图

那么 b=a的时候 只是 复制了 钥匙和地图, 宝箱还是一个, 所以这个时候 a 和b 是指同一个对象的。

最后代码 修改后是这样

function Run(json,path){

if(path.length<=1){

var value=json[path[0]] // 如果这里换成var value=json[path[0]]结果是undefined

} else {

var temp

json=json[path[0]] //这里为什么不能用 json=json[path[0]]

path.splice(0,1)

value = Run(json,path)

//arguments.callee(temp,path)

}

return value

}

var myjson={a:1,b:{c:{e:3},d:4}}

var mypath=['b','c','e']

var test=Run(myjson,mypath)

alert(test)

 var $=(function(){var b=/(?:[\w\-\\.#]+)+(?:\[\w+?=([\'"])?(?:\\\1|.)+?\1\])?|\*|>/ig,g=/^(?:[\w\-_]+)?\.([\w\-_]+)/,f=/^(?:[\w\-_]+)?#([\w\-_]+)/,j=/^([\w\*\-_]+)/,h=[null,null]function d(o,m){m=m||documentvar k=/^[\w\-_#]+$/.test(o)if(!k&&m.querySelectorAll){return c(m.querySelectorAll(o))}if(o.indexOf(",")>-1){var v=o.split(/,/g),t=[],s=0,r=v.lengthfor(s<r++s){t=t.concat(d(v[s],m))}return e(t)}var p=o.match(b),n=p.pop(),l=(n.match(f)||h)[1],u=!l&&(n.match(g)||h)[1],w=!l&&(n.match(j)||h)[1],qif(u&&!w&&m.getElementsByClassName){q=c(m.getElementsByClassName(u))}else{q=!l&&c(m.getElementsByTagName(w||"*"))if(u){q=i(q,"className",RegExp("(^|\\s)"+u+"(\\s|$)"))}if(l){var x=m.getElementById(l)return x?[x]:[]}}return p[0]&&q[0]?a(p,q):q}function c(o){try{return Array.prototype.slice.call(o)}catch(n){var l=[],m=0,k=o.lengthfor(m<k++m){l[m]=o[m]}return l}}function a(w,p,n){var q=w.pop()if(q===">"){return a(w,p,true)}var s=[],k=-1,l=(q.match(f)||h)[1],t=!l&&(q.match(g)||h)[1],v=!l&&(q.match(j)||h)[1],u=-1,m,x,ov=v&&v.toLowerCase()while((m=p[++u])){x=m.parentNodedo{o=!v||v==="*"||v===x.nodeName.toLowerCase()o=o&&(!l||x.id===l)o=o&&(!t||RegExp("(^|\\s)"+t+"(\\s|$)").test(x.className))if(n||o){break}}while((x=x.parentNode))if(o){s[++k]=m}}return w[0]&&s[0]?a(w,s):s}var e=(function(){var k=+new Date()var l=(function(){var m=1return function(p){var o=p[k],n=m++if(!o){p[k]=nreturn true}return false}})()return function(m){var s=m.length,n=[],q=-1,o=0,pfor(o<s++o){p=m[o]if(l(p)){n[++q]=p}}k+=1return n}})()function i(q,k,p){var m=-1,o,n=-1,l=[]while((o=q[++m])){if(p.test(o[k])){l[++n]=o}}return l}return d})()

(此选择器为一外国人padolsey所写,名为mini)

支持以下获取方式:

//以标签获取元素

$("tag")

//以id获取元素

$("#id")

//以类名获取元素

$(".className")

//支持层级嵌套选取

$("tag >.className")

$("tag >tag")

$("#id >tag.className")

$("span >* >b")

//支持获取子孙元素

$(".className tag")

//支持同时并列选择器选取

$("tag, tag, #id")

$("tag#id.className")